- 1、本文档共60页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理课程实验指导书-PL0语言及其编译器教程
《编译原理》课程实验指导书
(Compiler Principle)
目录
序言 1
一、实验安排 2
第一阶段:编译器的词法分析 2
第二阶段:编译器的语法分析 2
第三阶段:编译器的代码生成 3
二、考核方式及评定标准 4
三、参考资料与编译器分析 4
第一部分 PL语言及其编译器 4
1. PL语言介绍 4
1.1 PL语言的语法图 5
2. PL语言编译器 8
2.1 词法分析 9
2.2 语法分析 9
2.3 语义分析 11
2.4 代码生成 11
2.5 代码执行 13
2.6 错误诊断处理 15
2.7 符号表管理 17
2.8 其他 18
第二部分 上机实验要求 19
第三部分 PL语言编译器源程序与示例 21
1.示例与结果表示 21
1.1 PL语言源程序 21
1.2 生成的代码(片段) 23
2. PL语言编译器源程序 23
序言
本《编译原理》实验,其目的是让大家动手设计和实现一个规模适中的语言的编译器,该编译器不仅涉及编译程序的各个阶段,而且也强调了编译的总体设计、各个阶段的接口安排等等。
通过上机实践,来设计这个相对完整的编译器,一方面可以使同学们增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。
为了使学生能尽早动手实践,我们建议把实践分成三部分,首先阅读本教程第一部分,在这部分就PL语言的语法及其编译程序的各个阶段作了简单介绍,以便对PL编译程序有个初步的印象。其次要认真阅读理解第三部分所给出的PL编译器源程序及示例,使上一阶段的初步印象得以加深、具体化。最后按照第二部分的实验要求扩充PL语言的功能并加以实现。
具体操作时分成三个阶段:词法分析、语法分析及代码生成。最后再统一组装成一个完整的PL编译器,并适当进行改进、补充。
一、实验安排
第一阶段:编译器的词法分析
学时:2
(一)、L的语法图,设计、编制并调试一个PL词法分析程序,加深对词法分析原理的理解。
(二)、PL的词法分析器将要完成以下工作:
跳过分隔符(如空格,回车,制表符);
识别诸如begin,end,ifwhile等保留字;
识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。
识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;
识别:=,=,=之类的特殊符号,全局量sym则分别被赋值为SYM_BECOMES,SYM_LEQ,SYM_GEQ等。
相关过程(函数)有getsym(),getch(),其中getch()为获取单个字符的过程,除此之外,它还完成:
识别且跳过行结束符;
将输入源文件复写到输出文件;
产生一份程序列表,输出相应行号或指令计数器的值。
第二阶段:编译器的语法分析
学时:4
(一)、、
表示另一个图A的图:
表示终结符的单元图:
相关过程有:
block(), constdeclaration(), vardeclaration(), statement(), condition(), expression(), term(), factor()等。
并画出它们之间依赖关系图,并在此基础上实现程序的编制。
并适当进行语义分析的相关检查:
是否存在标识符先引用未声明的情况;
是否存在己声明的标识符的错误引用;
是否存在一般标识符的多重声明。
第三阶段:编译器的代码生成
学时:2
(一)、、 /* 将常数置于栈顶 */
(2)LOD /* 将变量值置于栈顶 */
(3)STO /* 将栈顶的值赋与某变量 */
(4)CAL /* 用于过程调用的指令 */
(5)INT /* 在数据栈中分配存贮空间 */
(6)JMP, JPC /* 用于if, while语句的条件或无条件控制转移指令 */
(7)OPR /* 一组算术或逻辑运算指令 */
上述指令的格式由三部分组成:
F L A 其中,f, l, a的含义见下表:
F L a INT ——— 常 量 LIT ——— 常 量 LOD 层次差 数据地址 STO 层次差 数据地址 CAL 层次差 程序地址 JMP ——— 程序地址 JPC ——— 程序地址 OPR ——— 运算类别
文档评论(0)