语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码北京交通大学(共24页).doc
《语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码北京交通大学(共24页).doc》由会员分享,可在线阅读,更多相关《语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码北京交通大学(共24页).doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上语义分析及中间代码生成程序设计原理与实现技术-实验报告及源代码北京交通大学语义分析及中间代码生成程序设计原理与实现技术 XXX 1028XXX2 计科1XXX班 1. 程序功能描述 完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过程。 GA:A?V:=E E?E+T?E-T? T?T*F?T/F?F F?(E)?i V?i 说明:终结符号i 为用户定义的简单变量,即标识符的定义。 2. 设计要求 (1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目
2、一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。 3. 主要数据结构描述: 本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改的,所以主要的数据结构也跟第四次差不多,主要为文法的表示,FirstVT集和LastVT集以及算符优先矩阵: struct info char left; vector right; vector first; vector last; ; 算符优先矩阵采用二维字符数组表示的: char mtr99; /算符优先矩阵 4. 程序结构描述: 本程序一共有8功能函数: void get
3、(); /获取文法 void print(); /打印文法 void fun(); /求FirstVT 和 LastVT void matrix(); /求算符优先矩阵 void test(); /测试文法 int cmp(char a,char b); 比较两个运算符的优先级 1 0 -1 void out(char now,int avg1,int avg2); /打印四元式 a,int b); /定义四元式计算方法 int ope(char op,int 5. 实验代码 详见附件 6. 程序测试 6.1 功能测试 程序运行显示如下功能菜单: 选择打印文法: 选择构造FirstVt集和La
4、stVT集: 选择构造算符优先矩阵: 6.2 文法测试 测试1:1+2*3 测试2:2+3+4*5+(6/2) 7. 学习总结 本次实验完成了语义及中间代码生成的设计原理与实现,所采用的方法为算符优先分析方法, 首先根据文法求出此文法的FirstVT集和LastVT集,然后根据他们求出此文法的算符优先矩阵。由于此文法和第四次文法基本相同,只是多了一条赋值语句,所以采用的规则和第四次基本相同。在分析阶段,每当遇到有规约的项目,判断一下,打印出此部运算的四元式,这样一步一步分析,知道输入的算术表达式计算分析完毕。 由于本次实验部分代码和第四次实验的代码比较相似,只需增加一点四元式的分析计算打印过程
5、,就能够顺利完成本次实验。 通过这次实验,我对语义分析以及中间代码部分有了一定的提高,对以后的学习有了一定程度上的帮助。 / lb6.cpp : 定义控制台应用程序的入口点。 / #include stdafx.h #include #include #include #include using namespace std; struct info char left; vector right; vector first; vector last; ; vector lang; char mtr99; /算符优先矩阵 stack sta; void get(); /获取文法 void pr
6、int(); /打印文法 void fun(); /求FirstVT 和 LastVT void matrix(); /求算符优先矩阵 void test(); /测试文法 int cmp(char a,char b); /比较两个运算符的优先级 1 0 -1 void out(char now,int avg1,int avg2); /打印四元式 int ope(char op,int a,int b); /定义四元式计算方法 int main() int choose; while(1) cout * endl; cout 获取文法请按 1 endl; cout 打印文法请按 2 endl
7、; cout 构造FirstVT集和LastVT集请按 3 endl; cout 构造优先关系矩阵请按 4 endl; cout 文法测试请按 5 endl; cout 结束请按 0 endl; cout * endl; cout choose; if(choose = 0) break; switch(choose) case 1: get(); break; case 2: print(); break; case 3: fun(); break; case 4: matrix(); break; case 5: test(); break; default:break; return 0
8、; void get() info temp,temp1,temp2; temp.left = E; temp.right.push_back(E+T); temp.right.push_back(E-T); temp.right.push_back(T); temp.right.push_back(i); temp1.left = T; temp1.right.push_back(T*F); temp1.right.push_back(T/F); temp1.right.push_back(F); temp2.left = F; temp2.right.push_back(E); temp2
9、.right.push_back(i); lang.push_back(temp); lang.push_back(temp1); lang.push_back(temp2); cout * endl; cout 文法获取完成 endl; cout * endl; cout endl; void print() cout * endl; for(int i = 0;i lang.size();i +) for(int j = 0;j langi.right.size();j +) cout langi.left ; cout langi.rightj endl; cout * endl; co
10、ut endl; void fun() int i,j,sign = 0,sign1 = 0; for(i = 0;i lang.size();i +) for(j = 0;j Z | temp0 = 2) /终结符 if(temp1 Z | temp1 A) langi.first.push_back(temp1); for(i = 0;i lang.size();i +) for(j = 0;j Z | temp0 = 3) /终结符 if(temp1 Z | temp1 Z | temp2 A) /终结符 langi.last.push_back(temp2); while(sign =
11、 0) /迭代FirstVT sign = 1; for(i = 0;i lang.size();i +) for(j = 0;j langi.right.size();j +) string temp = langi.rightj; /获取右部 if(temp.length() = 1 & (temp0 = A)/可以迭代 for(int k = 0;k lang.size();k +) if(langk.left = temp0) /找到了,添加元素 for(int p = 0;p langk.first.size();p +) sign1 = 0; char ch = langk.fir
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语义 分析 中间 代码 生成 程序设计 原理 实现 技术 实验 报告 源代码 北京 交通大学 24
限制150内