没有合适的资源?快使用搜索试试~ 我知道了~
首页编译原理PL0实验报告
资源详情
资源评论
资源推荐

PL0 语言文法编译器
实验报告
课程名称:程序设计语言编译原理
实验名称: PL0 语言文法编译器
学生学院:
学生班级:
学生学号:
学生姓名:
提交日期: 2019.12.11

目录
实验目标...............................................................................................................3
实验概览...............................................................................................................3
实验要求........................................................................................................3
PL0 语言文法的 BNF 表示.................................................................................3
词法分析...............................................................................................................4
词法分析要完成的任务.....................................................................................4
词法分析实现分析............................................................................................5
词法分析用到的存储结构和函数..................................................................5
Void Init()在类型表 sym 中填入类型...........................................................5
Void pretreatment(string line)去除掉当前行代码中多余的空格...................7
int check(char x)检测字符类型并返回对应类型的整数.................................7
Void getSym()读取文件并提取词汇...........................................................7
void putIn(string) 对提取出的词汇进行分析的函数.....................................9
Void output()输出词法分析的结果...........................................................10
词法分析结果样例.........................................................................................11
语法分析.............................................................................................................13
语法分析要完成的任务...................................................................................13
PL0 语言文法的 EBNF 表示.............................................................................13
语法分析实现分析.........................................................................................15
实现语法分析需要的存储结构...................................................................15
实现语法分析需要的函数..........................................................................16
语义分析和目标代码生成......................................................................................18
说明部分的处理.............................................................................................18
说明部分处理的分析................................................................................19
语句处理和目标代码生成................................................................................20
8 条目标指令..........................................................................................20
目标指令生成分析...................................................................................20
解释执行.............................................................................................................21
解释执行部分用到的数据结构和函数................................................................21
解释执行部分函数分析...................................................................................21
Void getResult()...................................................................................21
Void OPR()............................................................................................24
Int getVar(int l,int a)............................................................................26
Void changeVar(int l,int a)...................................................................26
代码结构解释......................................................................................................28
问题和总结.........................................................................................................28
附件...................................................................................................................29
头文件 pch.h................................................................................................29
头文件实现文件 pch.cpp...............................................................................32
主程序 Grammer.cpp...................................................................................66

实验目标
本实验作为程序设计语言编译原理的实验课,旨在提升同学们的动手编程能力,借助
实验巩固上课所学习的编译原理相关的知识。
本实验可大致分为四个阶段,分别为词法分析、语法分析、语义分析和目标代码生成、
解释执行。四个部分相对独立,对应《高级程序语言编译原理》课本讲解顺序。实验课时
长 32 学时,截止提交时间为本学期第 15 周周三。
实验概览
实验要求
PL0 语言相对来说是一种比较简易的编程语言语言,下一小节我们会给出 PL0 语言文
法的 BNF 表示。本实验的结果要求得到一个能够对 PL0 语言代码执行并能输出正确结果
的程序。
词法分析:对代码进行词法分析,提取出代码中的词(包含标识符,数字,符号等);
语法分析:对代码进行语法分析,推导语言文法,给出语法树,同时检测不符合语法
规范的代码并报错;
语义分析和目标代码生成:对语法分析的结果进行语义分析,给出对应等价的中间代
码;
解释执行:对中间代码解释执行,给出代码执行的结果。
PL0 语言文法的 BNF 表示
1. 〈程序〉→〈分程序〉。
2. 〈分程序〉→ [<常量说明部分>][<变量说明部分>][<过程说明部分>]〈语句〉
3. <常量说明部分>→CONST<常量定义>{,<常量定义>};
4. <常量定义>→<标识符>=<无符号整数>
5. <无符号整数>→<数字>{<数字>}
6. <变量说明部分>→VAR<标识符>{,<标识符>};
7. <标识符>→<字母>{<字母>|<数字>}

8. <过程说明部分>→<过程首部><分程度>;{<过程说明部分>}
9. <过程首部>→procedure<标识符>;
10. <语句>→<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>
|< 复合语句>|<空>
11. <赋值语句>→<标识符>:=<表达式>
12. <复合语句>→begin<语句>{;<语句>}<end>
13. <条件>→<表达式><关系运算符><表达式>|odd<表达式>
14. <表达式>→[+|-]<项>{<加减运算符><项>}
15. <项>→<因子>{<乘除运算符><因子>}
16. <因子>→<标识符>|<无符号整数>|(<表达式>)
17. <加减运符>→+|-
18. <乘除运算符>→*|/
19. <关系运算符>→=|#|<|<=|>|>=
20. <条件语句>→if<条件>then<语句>
21. <过程调用语句>→call<标识符>
22. <当型循环语句>→while<条件>do<语句>
23. <读语句>→read(<标识符>{,<标识符>})
24. <写语句>→write(<标识符>{,<标识符>})
25. <字母>→a|b|c…x|y|z
26. <数字>→0|1|2…7|8|9
词法分析
把关键字、算符、界符称为语言固有的单词,标识符、常量称为用户自定义的单词。
词法分析要完成的任务
1. 滤掉单词间多余的空格
2. 识别关键字,用查关键字表的方式识别。
3. 识别标识符,标识符的类型为 ID。
4. 拼数,将数的类别 NUMBER 放在 SYM 中
5. 拼由两个字符组成的运算符,如>=、<=d 等等,识别后将其放在 SYM 中
6. 打印程序,将识别出来的字符打印

词法分析实现分析
词法分析用到的存储结构和函数
首先给出储存每一个分析出来的词汇的基本储存结构,
1. classTernary{
2. public:
3. intID;//储存着词汇类型对应的 ID
4. stringname;//存储着分析出来词汇
5. intnumber;//存储着这个词汇是对应 ID 的第几个
6. Ternary(inta,stringb,intc){//重构函数
7. ID=a;
8. name=b;
9. number=c;
10. }
11. };
接下来给出主要的存储结构
1. vector<string>sym;//类型表
2. vector<int>sym_num;//当前这种类型的数量
3. vector<Ternary>word;//从程序中读到的东西
以下是词法分析部分会用到的函数
1. voidinit();//预处理,建立保留字/其他表格
2. intcheck(char);//检查当前字符的类别
3. voidgetSym();//词法分析部分
4. intgetID(string);//获得当前单词的类别的 ID
5. voidputIn(string);//把得到的单词放进 word 里
6. voidoutput();//输出词法分析的结果
接下来的小节中,我们会介绍各个函数的实现机制。
Void Init()在类型表 sym 中填入类型
1. voidGrammer::init(){
2. //生成类表
剩余63页未读,继续阅读











安全验证
文档复制为VIP权益,开通VIP直接复制

评论0