语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码-北京交通大学_第1页
语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码-北京交通大学_第2页
语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码-北京交通大学_第3页
语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码-北京交通大学_第4页
语义分析及中间代码生成程序设计原理与实现技术--实验报告及源代码-北京交通大学_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、语义分析及中间代码生成程序设计原理与实现技术XXX 1028XXX2 计科1XXX班1. 程序功能描述完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过程。GA:AV:=EEE+TE-TTT*FT/FFF(E)iVi说明:终结符号i 为用户定义的简单变量,即标识符的定义。2. 设计要求(1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。3. 主要数据结构描述:

2、本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改的,所以主要的数据结构也跟第四次差不多,主要为文法的表示,FirstVT集和LastVT集以及算符优先矩阵:struct infochar left;vector right;vector first;vector last;算符优先矩阵采用二维字符数组表示的:char mtr99; /算符优先矩阵4. 程序结构描述:本程序一共有8功能函数:void get(); /获取文法void print(); /打印文法void fun(); /求FirstVT 和 LastVTvoid matrix(); /求算符优先矩阵void

3、 test(); /测试文法int cmp(char a,char b); 比较两个运算符的优先级 1 0 -1void out(char now,int avg1,int avg2); /打印四元式int ope(char op,int a,int b); /定义四元式计算方法5. 实验代码详见附件6. 程序测试6.1 功能测试程序运行显示如下功能菜单:选择打印文法:选择构造FirstVt集和LastVT集:选择构造算符优先矩阵:6.2 文法测试测试1:1+2*3测试2:2+3+4*5+(6/2)7. 学习总结本次实验完成了语义及中间代码生成的设计原理与实现,所采用的方法为算符优先分析方法,

4、 首先根据文法求出此文法的FirstVT集和LastVT集,然后根据他们求出此文法的算符优先矩阵。由于此文法和第四次文法基本相同,只是多了一条赋值语句,所以采用的规则和第四次基本相同。在分析阶段,每当遇到有规约的项目,判断一下,打印出此部运算的四元式,这样一步一步分析,知道输入的算术表达式计算分析完毕。由于本次实验部分代码和第四次实验的代码比较相似,只需增加一点四元式的分析计算打印过程,就能够顺利完成本次实验。通过这次实验,我对语义分析以及中间代码部分有了一定的提高,对以后的学习有了一定程度上的帮助。/ lb6.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#in

5、clude #include #include #include using namespace std;struct infochar left;vector right;vector first;vector last;vector lang;char mtr99; /算符优先矩阵stack sta;void get(); /获取文法void print(); /打印文法void fun(); /求FirstVT 和 LastVTvoid matrix(); /求算符优先矩阵void test(); /测试文法int cmp(char a,char b); /比较两个运算符的优先级 1 0

6、 -1void 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;cout 构造FirstVT集和LastVT集请按 3 endl;cout 构造优先关系矩阵请按 4 endl;cout 文法测试请按 5 endl;cout 结束请按 0 endl;cout * endl;cout choose;if(choose = 0)brea

7、k;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;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);temp

8、1.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.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(i

9、nt i = 0;i lang.size();i +)for(int j = 0;j langi.right.size();j +)cout langi.left ;cout langi.rightj endl;cout * endl;cout 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

10、+)for(j = 0;j Z | temp0 = 3) /终结符if(temp1 Z | temp1 Z | temp2 A) /终结符langi.last.push_back(temp2);while(sign = 0) /迭代FirstVTsign = 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 +)i

11、f(langk.left = temp0) /找到了,添加元素for(int p = 0;p langk.first.size();p +)sign1 = 0;char ch = langk.firstp;for(int q = 0;q langi.first.size();q +)if(langi.firstq = ch) /包含了sign1 = 1;if(sign1 = 0)langi.first.push_back(ch);sign = 0;sign = 0;while(sign = 0) /迭代LastVTsign = 1;for(i = 0;i lang.size();i +)for

12、(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.last.size();p +)sign1 = 0;char ch = langk.lastp;for(int q = 0;q langi.last.size();q +)if(langi.lastq = ch) /包含

13、了sign1 = 1;if(sign1 = 0)langi.last.push_back(ch);sign = 0;cout * endl;cout FirstVT: endl;for(i = 0;i lang.size();i +)cout langi.left : ;for(j = 0;j langi.first.size();j +)cout langi.firstj ;cout endl;cout endl;cout LasttVT: endl;for(i = 0;i lang.size();i +)cout langi.left : ;for(j = 0;j langi.last.s

14、ize();j +)cout langi.lastj ;cout endl;cout * endl;cout endl;void matrix()int i,j;for(i = 0;i 9;i +) /初始化for(j = 0;j 9;j +)mtrij = n;string temp = +-*/()i#;for(i = 1;i 9;i +)mtri0 = tempi - 1;mtr0i = tempi - 1;vector str;for(i = 0;i lang.size();i +) /aU a FirstVT(U)for(j = 0;j 2)if(ss0 Z | ss0 A) & (

15、ss1 = A) /aUok = ;ok += ss0;ok += ss1;str.push_back(ok);if(ss1 Z | ss1 A) & (ss2 = A) /aUok = ;ok += ss1;ok += ss2;str.push_back(ok);for(i = 0;i str.size();i +)for(j = 1;j 9;j +)if(mtrj0 = stri0) /Find a Then Find FirstVt(U)for(int k = 0;k lang.size();k +)if(langk.left = stri1) /Find Ufor(int p = 0;

16、p langk.first.size();p +)for(int q = 1;q 9;q +)if(mtrq0 = langk.firstp)mtrjq = ;str.clear();for(i = 0;i afor(j = 0;j 2)if(ss1 Z | ss1 A) & (ss0 = A) /Uaok = ;ok += ss0;ok += ss1;str.push_back(ok);if(ss2 Z | ss2 A) & (ss1 = A) /Uaok = ;ok += ss1;ok += ss2;str.push_back(ok);for(i = 0;i str.size();i +)

17、for(j = 1;j 9;j +)if(mtr0j = stri1) /Find a Then Find LastVt(U)for(int k = 0;k lang.size();k +)if(langk.left = stri0) /Find Ufor(int p = 0;p langk.last.size();p +)for(int q = 1;q ;str.clear();for(i = 0;i lang.size();i +) /ab aUb a = bfor(j = 0;j 2)if(ss1 Z | ss1 Z | ss0 Z | ss2 Z | ss1 Z | ss2 Z | s

18、s0 A) /aUaok = ;ok += ss0;ok += ss2;str.push_back(ok);for(i = 0;i str.size();i +)for(j = 1;j 9;j +)if(stri0 = mtrj0)for(int k = 1;k 9;k +)if(mtr0k = stri1)mtrjk = =;for(i = 0;i lang0.first.size();i +) /#for(j = 1;j 9;j +)if(lang0.firsti = mtr0j)mtr8j = ;for(i = 0;i lang0.first.size();i +) /#for(j =

19、1;j ;mtr88 = =;cout * endl;for(i = 0;i 9;i +)for(j = 0;j 9;j +)if(mtrij != n)cout mtrij ;elsecout ;cout endl;cout * endl;cout endl;void test()cout * endl;cout 请输入算术表达式: str;str += #;int i,j,k;stack data;stack op;op.push(#);char now = n; /记录当前栈顶操作符int sign = 0;for(i = 0;i = 0 & stri = 9) /操作数int temp = stri - 0;data.push(temp);else /运算符op.push(stri);sign = 1;if(now != n & sign = 1) /有可比性,并且操作符栈有更新if(!op.empty()char top = op.top(); /栈顶元素while(cmp(now,top) = 1) /需要规约int avg1 = data.top();data.pop();int avg2 = data.top();data.pop();out(now,avg2,avg1); /打印四元式data.push(ope(now,avg2,av

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论