没有合适的资源?快使用搜索试试~ 我知道了~
广州大学编译原理实验二
资源推荐
资源详情
资源评论
广州大学学生实验报告
开课学院及实验室:计算机科学与工程实验室电子楼 418A 室 2024 年 5 月 28 日
学院
计算机科学与
网络工程学院
年级、专
业、班
姓名
学号
实验课程
名称
编译原理实验
成绩
实验项目
名称
实验二:语法分析
指导
老师
吴昱
一、实验目的
设计并编码实现一个自上而下或自下而上的语法分析器,加深对语法分析原理的理解,从而掌
握语法分析程序的构造过程。
二、实验环境
Win11、visual studio
三、实验内容及原理
探索部分实验要求
(二)编写一个 LR(0)语法分析器,不仅能依据输入的文法自动生成相应的 LR(0)分析表,并
实现对输入串的语法分析
输入:一个由四元组表示的文法、一个待识别的字符串
输出:
自动生成的 LR(0)分析表
分析过程表
分析结果
编码实现以下功能:
1) 将已构建的 LR(0)语法分析表进行编码存储;
2) 编码实现查表分析的功能,该功能包含自左向右扫描输入串,依据当前输入指针所指向的字符
和栈顶元素进行查表,通过模拟进栈、出栈的操作来实现分析过程;
3) 输出内容包含三部分,按顺序分别是:LR(0)语法分析表、分析过程表以及分析结果。
4) 按模板撰写完成详细的实验报告,根据完成的工作量、正确性和代码注释与实验报告清晰程度
综合打分。
四、关键数据结构和核心算法
实验前先画好算法流程图:
4.1 数据结构
构造 LR(0)分析表的步骤
(1)写出给定文法 G 的拓广文法 G‘
(2)写出文法 G'的 LR(0)项目集
(3)利用 CLOSURE 和 GOTO 函数,求出相应的 LR(0)项目集规范族 C
(4)构造识别该文法全部活前缀的 DFA
(5)根据算法构造 LR(0)分析表
文法表示为四元组 G[S] = [终结符号集,非终结符集,文法开始符和产生式的非空有限集]
因此定义数据结构如下:
(1)产生式:
1. // 定义表示产生式的结构体
2. struct Production {
3. string left;//左部
4. vector<string>right;//右部,可能有多个
5. bool isEmpty = false;//判断是否为空产生式
6. int dotPosition;//记录点的位置,用于 LR(0)分析的项目集
7.
8. //获取右部产生式的字符串表示
9. string getRight() {
10. string rightstring = "";
11. for (int i = 0; i < right.size() - 1; i++)
12. rightstring += right[i] + " ";
13. //如果不为空,则将 right 中的最后一个元素添加到 ans 变量中
14. if (!right.empty()) {
15. rightstring += right.back();
16. }
17. return rightstring;
18. }
19.
20. //获取整个产生式的字符串表示
21. string getProduction() {
22. return left + "->" + getRight();
23. }
24.
25. //初始化点的位置为 0
26. Production() {
27. dotPosition = 0;
28. }
29.
30. //获取带点的项目表示
31. string getItem() {
32. string Item = left + "->";
33. if (dotPosition == 0) {
34. Item += "· ";//初始位置
35. }
36. for (int i = 0; i < right.size(); i++) {
37. Item += right[i] + " ";
38. if (dotPosition == i + 1) {
39. Item += "· ";//不在初始位置
40. }
41. }
42. return Item;
43. }
44.
45. //重载运算符==,用于判断产生式是否相等
46. //相等的两种条件:项目相同且点的位置相同
47. bool operator == (Production a) {
48. return getProduction() == a.getProduction() && dotPosition ==
a.dotPosition;
49. }
50. };
分析:
(1)getRight() 函数用于获取产生式右部的字符串表示
(2)getProduction() 函数将左部和右部拼接起来,形成完整的产生式字符串表示
(3)getItem() 函数在产生式的基础上加入点的位置,在 LR(0) 项目集中显示项目的当前状态
(4)重载 == 运算符可以方便地比较两个产生式是否相同,便于后面对项目集的处理和查找
(2)项目集闭包:
1. //定义项目集闭包的结构体
2. struct Closure {
3. vector<Production> items;//项目集集合
4. int coreItemLength = 0; //核项目的长度
5. //第一个元素是字符串(表示一个 ACTION 或 GOTO 的目标),第二个元素是一个整数(状态编号)
6. vector<pair<string, int> >next;
7. bool guiYue = false;//用于判断是否可规约
8.
9. //比较两个 Closure 对象是否相等,可以回转状态
10. bool operator ==(Closure a) {
11. //判断相等只比较核项目
12. if (coreItemLength != a.coreItemLength)
13. //核项目长度不等
14. return false;
15. for (int i = 0; i < coreItemLength; i++) {
16. //分别比较每一项,利用 Production 对运算符==的重载
17. if (!(items[i] == a.items[i])) {
18. return false;
19. }
20. }
21. return true;
22. }
24. //获取闭包的字符串表示
25. string getClosure() {
26. string ansStr = "";
27. for (int i = 0; i < items.size(); i++) {
28. ansStr += items[i].getItem() + "\n";//获取项目集合
29. }
30. for (int i = 0; i < next.size(); i++) {
31. ansStr += next[i].first + "/" + to_string(next[i].second) + "
";
32. }
33. return ansStr;
34. }
35. };
分析:
(1)vector<Production> items: 项目集的集合,每个元素是一个产生式(Production)。
(2)coreItemLength 用于在比较两个闭包,只考虑核项目(即最基本的项目集)。
(3)next 保存了当前闭包可以扩展的状态,便于构建 DFA。
(4)重载的 == 运算符可以方便地比较两个闭包是否相等,有利于构建 LR(0) 项目集规范族
(5)getClosure() 方法能够返回当前闭包的字符串表示
(3)分析过程:
1. //定义描述分析过程的结构体
2. struct Description
3. {
4. vector<int> state;//状态栈
5. string symbol; //符号
6. string inputString;//输入串
7. string ACTION;
8. string GOTO;
9. Description() {}
10. Description(vector<int> state, string symbol, string inputString, string action,
string GOTO) {
11. this->state = state;
12. this->symbol = symbol;
13. this->inputString = inputString;
14. this->ACTION = action;
15. this->GOTO = GOTO;
16. }
17. };
(4)综合语法结构:
1. //定义表示整个语法的结构体
2. struct Grammar
3. {
4. vector<Production> productions;//文法产生式
5. vector<string> nonTerminal;//文法非终结符
6. vector<string> terminal;//文法终结符
7. string startSymbol = "";//开始符号
8. map<pair<int, string>, string> predictionMap;//状态 i 遇到 A/a 时,Action 或 Goto 为 j
9. vector<Closure>itemSet;//整个 DFA
10. vector<Description> description;//分析过程
11. //重载输出运算符
12. friend ostream& operator <<(ostream& os, const Grammar& g);
13. }grammar;
剩余20页未读,继续阅读
资源评论
Ms_Lars
- 粉丝: 506
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 无人机辅助应急通信中总和速率最大化的优先用户关联附matlab代码.rar
- 无人机辅助移动边缘计算系统中的轨迹优化与计算卸载策略python代码.rar
- 无人机轨迹跟踪matlab仿真.rar
- 无人机轨迹跟踪simulink仿真.rar
- 无人机轨迹与路径规划matlab仿真.rar
- 无人机航路规划算法matlab代码.rar
- 无人机降落伞 Simulink 模型.rar
- 无人机路径规划和轨迹算法的实现 matlab代码.rar
- 无人机转弯方式函数包附matlab代码.rar
- 无人机双基地SAR matlab实现.rar
- 无人机视频处理matlab代码.rar
- 效率网络分析仪(ENA)通过图形用户界面计算通信网络中主要多址协议在不同负载条件下的性能Matlab代码.rar
- 无人系统自助航路规划及自助避碰程序仿真 matlab代码.rar
- 系链四旋翼无人机-海上机车浮标系统MATLAB实现.rar
- 一个轻量级、高性能的C、C++和MATLAB卡尔曼滤波器库.rar
- 一维弦振动和二维鼓面振动的理论解的数值实现 matlab代码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功