欢迎来到天天文库
浏览记录
ID:35235189
大小:96.64 KB
页数:9页
时间:2019-03-22
《编译原理实验报告pl0》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、PL/0语言编译器分析实验报告学院:计算机学院学号:1112057195姓名:夏建鑫课程名称:编译原理一、实验目的通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码,加深对编译阶段(包括词法分析、语法分析、语义分析、中间代码生成等)和编译系统软件结构的理解,并达到提高学生学习兴趣的目的。二、实验要求(1)要求掌握基本的程序设计技巧(C语言)和阅读较大规模程序源代码的能力;(2)理解并掌握编译过程的逻辑阶段及各逻辑阶段的功能;(3)要求能把握整个系统(PL/0语言编译器)的体系结构,各功能模块的功能,各模块之间的接口;(4)要求能
2、总结出实现编译过程各逻辑阶段功能采用的具体算法与技术。三、实验步骤(1)根据PL/0语言的语法图,理解PL/0语言各级语法单位的结构,掌握PL/0语言合法程序的结构;(2)从总体上分析整个系统的体系结构、各功能模块的功能、各模块之间的调用关系、各模块之间的接口;(3)详细分析各子程序和函数的代码结构、程序流程、采用的主要算法及实现的功能;(4)撰写分析报告,主要内容包括系统结构框图、模块接口、主要算法、各模块程序流程图等。四、报告内容PL/0语言语法的BNF表示-1,对语法描述图的解析<程序>→<程序体>.<程序体>→[<常量说明部分>
3、][变量说明部分>][<过程说明部分>]<语句><常量说明部分>→const<常量定义>{,<常量定义>};<常量定义>→<标识符>=<无符号整数><无符号整数>→<数字>{<数字>}<变量说明部分>→var<标识符>{,<标识符>};<标识符>→<字母>{<字母>
4、<数字>}<过程说明部分>→<过程首部><程序体>{;<过程说明部分>};<过程首部>→procedure<标识符>;<语句>→<赋值语句>
5、<条件语句>
6、<当型循环语句>
7、<过程调用语句>
8、<复合语句><赋值语句>→<标识符>:=<表达式><复合语句>→begin<语句序
9、列>end<语句序列>→<语句>{;<语句>}<条件>→<表达式><关系运算符><表达式>
10、odd<表达式><表达式>→[+
11、-]<项>{<加法运算符><项>}<项>→<因子>{<乘法运算符><因子>}<因子>→<标识符>
12、<无符号整数>
13、'('<表达式>')'<加法运算符>→+
14、-<乘法运算符>→*
15、/<关系运算符>→=
16、<>
17、<
18、<=
19、>
20、>=<条件语句>→if<条件>then<语句><过程调用语句>→call<标识符><当型循环语句>→while<条件>do<语句><字母>→a
21、b
22、...
23、x
24、y
25、z<数字>→0
26、1
27、2
28、...
29、
30、8
31、9编译程序总体流程图Pl/0词法分析程序Getsym识别的单词:(类别,值)保留字:如:BEGIN、END、IF、THEN等运算符:如:+、-、*、/、:=、#、>=、<=等标识符:用户定义的变量名、常数名、过程名常数:如:10、25、100等整数界符:如:‘,’、‘.’、‘;’、‘(’、‘)’等读字符子程序(getch)〈表达式〉的递归子程序实现procedureexpr;beginifsymin[plus,minus]thenbegingetsym;term;endelseterm;whilesymin[plus,minus]d
32、obegingetsym;term;endend;〈因子〉∷=〈标识符〉
33、〈无符号整数〉
34、‘(’〈表达式〉‘)’〈因子〉的递归子程序实现procedurefactor;beginifsym<>identthenbeginifsym<>numberthenbeginifsym=‘(‘thenbegingetsym;expr;ifsym=‘)’thengetsymelseerrorendelseerrorendelsegetsymendelsegetsymend;常量定义语句的处理语法:<常量说明部分>::=const<常量定义>{,<常量
35、定义>};<常量定义>::=<标识符>=<无符号整数><无符号整数>::=<数字>{<数字>}ifsym=constsymthenbegingetsym;(*获取下一个token,正常应为用作常量名的标识符*)repeat(*反复进行常量声明*)constdeclaration;(*声明以当前token为标识符的常量*)whilesym=commado(*如果遇到了逗号则反复声明下一常量*)begingetsym;(*获取下一个token,这里正好应该是标识符*)constdeclaration(*声明以当前token为标识符的常量*)
36、end;ifsym=semicolonthen(*如果常量声明结束,应遇到分号*)getsym(*获取下一个token,为下一轮循环做好准备*)elseerror(5)(*提示5号错误*)untilsym<
此文档下载收益归作者所有