版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.语义分析及中间代码生成程序设计原理与实现技术XXX1028XXX2 计科1XXX班程序功能描述完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过程。G[A]:A→V:=EE→E+T∣E-T∣T→T*F∣T/F∣FF→(E)∣iV→i说明:终结符号 i为用户定义的简单变量 ,即标识符的定义。设计要求1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。主要数据结构描述:本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改的,所以主要的数据结构也跟第四次差不多,主要为文法的表示, FirstVT集和LastVT集以及算符优先矩阵:word专业资料.structinfo{charleft;vector<string>right;vector<char>first;vector<char>last;};算符优先矩阵采用二维字符数组表示的:charmtr[9][9];// 算符优先矩阵程序结构描述:本程序一共有 8功能函数:voidget(); //获取文法voidprint(); //打印文法voidfun(); //求FirstVT 和LastVTvoidmatrix();// 求算符优先矩阵voidtest(); //测试文法intcmp(chara,charb); 比较两个运算符的优先级 1 0 -1voidout(charnow,intavg1,intavg2);// 打印四元式intope(charop,inta,intb); //定义四元式计算方法实验代码详见附件程序测试6.1 功能测试程序运行显示如下功能菜单:word专业资料.选择打印文法:选择构造FirstVt集和LastVT集:word专业资料.选择构造算符优先矩阵:6.2 文法测试word专业资料.测试1:1+2*3测试2:2+3+4*5+(6/2)word专业资料.学习总结本次实验完成了语义及中间代码生成的设计原理与实现, 所采用的方法为算符优先分析方法, 首先根据文法求出此文法的 FirstVT集和LastVT集,然后根据他们求出此文法的算符优先矩阵。 由于此文法和第四次文法基本相同, 只是多了一条赋值语句, 所以采用的规则和第四次基本相同。在分析阶段,每当遇到有规约的项目,判断一下,打印出此部运算的四元式,这样一步一步分析,知道输入的算术表达式计算分析完毕。由于本次实验部分代码和第四次实验的代码比较相似, 只需增加一点四元式的分析word专业资料.计算打印过程,就能够顺利完成本次实验。通过这次实验,我对语义分析以及中间代码部分有了一定的提高, 对以后的学习有了一定程度上的帮助。lb6.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<iostream>#include<string>#include<VECTOR>#include<stack>usingnamespacestd;structinfo{charleft;vector<string>right;vector<char>first;vector<char>last;};vector<info>lang;word专业资料.charmtr[9][9];// 算符优先矩阵stack<char>sta;voidget(); //获取文法voidprint(); //打印文法voidfun(); //求FirstVT 和LastVTvoidmatrix();// 求算符优先矩阵voidtest(); //测试文法intcmp(chara,charb); //比较两个运算符的优先级 1 0-1voidout(charnow,intavg1,intavg2); //打印四元式intope(charop,inta,intb); //定义四元式计算方法intmain(){intchoose;while(1){cout<<"****************************************"<<endl;cout<<"获取文法请按1"<<endl;cout<<"打印文法请按2"<<endl;cout<<"构造FirstVT集和LastVT集请按3"<<endl;cout<<"构造优先关系矩阵请按4"<<endl;cout<<"文法测试请按5"<<endl;word专业资料.cout<<" 结束请按 0" <<endl;cout<<"****************************************"<<endl;cout<<endl;cin>>choose;if(choose==0)break;switch(choose){case1:get();break;case2:print();break;case3:fun();break;case4:matrix();break;case5:test();break;default:break;}}return0;}voidget(){infotemp,temp1,temp2;temp.left='E';word专业资料.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.right.push_back("i");lang.push_back(temp);lang.push_back(temp1);lang.push_back(temp2);cout<<"****************************************"<<endl;cout<<" 文法获取完成" <<endl;cout<<"****************************************"<<endl;cout<<endl;}word专业资料.voidprint(){cout<<"****************************************"<<endl;for(inti=0;i<lang.size();i++){for(intj=0;j<lang[i].right.size();j++){cout<<lang[i].left<<"-->";cout<<lang[i].right[j]<<endl;}}cout<<"****************************************"<<endl;cout<<endl;}voidfun(){inti,j,sign=0,sign1=0;for(i=0;i<lang.size();i++){for(j=0;j<lang[i].right.size();j++){stringtemp=lang[i].right[j]; //获取右部if(temp[0]>'Z'||temp[0]<'A'){ //终结符lang[i].first.push_back(temp[0]);}elseif(temp.length()>=2){// 终结符word专业资料.if(temp[1]>'Z'||temp[1]<'A'){lang[i].first.push_back(temp[1]);}}}}for(i=0;i<lang.size();i++){for(j=0;j<lang[i].right.size();j++){stringtemp=lang[i].right[j]; //获取右部if((temp[0]>'Z'||temp[0]<'A')&&temp.length()==1){ //终结符lang[i].last.push_back(temp[0]);}elseif(temp.length()>=3){// 终结符if(temp[1]>'Z'||temp[1]<'A')lang[i].last.push_back(temp[1]);elseif(temp[2]>'Z'||temp[2]<'A')// 终结符lang[i].last.push_back(temp[2]);}}}word专业资料.while(sign==0){// 迭代FirstVTsign=1;for(i=0;i<lang.size();i++){for(j=0;j<lang[i].right.size();j++){stringtemp=lang[i].right[j]; //获取右部if(temp.length()==1&&(temp[0]<='Z'&&temp[0]>='A')){// 可以迭代for(intk=0;k<lang.size();k++){if(lang[k].left==temp[0]){ //找到了,添加元素for(intp=0;p<lang[k].first.size();p++){sign1=0;charch=lang[k].first[p];for(intq=0;q<lang[i].first.size();q++){if(lang[i].first[q]==ch){ //包含了sign1=1;}}if(sign1==0){lang[i].first.push_back(ch);sign=0;}}word专业资料.}}}}}}sign=0;while(sign==0){// 迭代LastVTsign=1;for(i=0;i<lang.size();i++){for(j=0;j<lang[i].right.size();j++){stringtemp=lang[i].right[j]; //获取右部if(temp.length()==1&&(temp[0]<='Z'&&temp[0]>='A')){// 可以迭代for(intk=0;k<lang.size();k++){if(lang[k].left==temp[0]){ //找到了,添加元素for(intp=0;p<lang[k].last.size();p++){sign1=0;charch=lang[k].last[p];for(intq=0;q<lang[i].last.size();q++){if(lang[i].last[q]==ch){ //包含了word专业资料.sign1=1;}}if(sign1==0){lang[i].last.push_back(ch);sign=0;}}}}}}}}cout<<"****************************************"<<endl;cout<<"FirstVT:"<<endl;for(i=0;i<lang.size();i++){cout<<lang[i].left<<":";for(j=0;j<lang[i].first.size();j++){cout<<lang[i].first[j]<<" ";}word专业资料.cout<<endl;}cout<<endl;cout<<"LasttVT:"<<endl;for(i=0;i<lang.size();i++){cout<<lang[i].left<<":";for(j=0;j<lang[i].last.size();j++){cout<<lang[i].last[j]<<" ";}cout<<endl;}cout<<"****************************************"<<endl;cout<<endl;}voidmatrix(){inti,j;for(i=0;i<9;i++){ //初始化for(j=0;j<9;j++){mtr[i][j]='n';}}word专业资料.stringtemp="+-*/()i#";for(i=1;i<9;i++){mtr[i][0]=temp[i-1];mtr[0][i]=temp[i-1];}vector<string>str;for(i=0;i<lang.size();i++){ //aU a<FirstVT(U)for(j=0;j<lang[i].right.size();j++){stringss=lang[i].right[j];stringok="";if(ss.length()>2){if((ss[0]>'Z'||ss[0]<'A')&&(ss[1]<='Z'&&ss[1]>='A')){ //aUok="";ok+=ss[0];ok+=ss[1];str.push_back(ok);}if((ss[1]>'Z'||ss[1]<'A')&&(ss[2]<='Z'&&ss[2]>='A')){ //aUok="";word专业资料.ok+=ss[1];ok+=ss[2];str.push_back(ok);}}}}for(i=0;i<str.size();i++){for(j=1;j<9;j++){if(mtr[j][0]==str[i][0]){ //FindaThenFindFirstVt(U)for(intk=0;k<lang.size();k++){if(lang[k].left==str[i][1]){ //FindUfor(intp=0;p<lang[k].first.size();p++){for(intq=1;q<9;q++){if(mtr[q][0]==lang[k].first[p]){mtr[j][q]='<';}}}}}word专业资料.}}}str.clear();for(i=0;i<lang.size();i++){ //Ua LastVT(U)>afor(j=0;j<lang[i].right.size();j++){stringss=lang[i].right[j];stringok="";if(ss.length()>2){if((ss[1]>'Z'||ss[1]<'A')&&(ss[0]<='Z'&&ss[0]>='A')){ //Uaok="";ok+=ss[0];ok+=ss[1];str.push_back(ok);}if((ss[2]>'Z'||ss[2]<'A')&&(ss[1]<='Z'&&ss[1]>='A')){ //Uaok="";ok+=ss[1];ok+=ss[2];word专业资料.str.push_back(ok);}}}}for(i=0;i<str.size();i++){for(j=1;j<9;j++){if(mtr[0][j]==str[i][1]){ //FindaThenFindLastVt(U)for(intk=0;k<lang.size();k++){if(lang[k].left==str[i][0]){ //FindUfor(intp=0;p<lang[k].last.size();p++){for(intq=1;q<9;q++){if(mtr[0][q]==lang[k].last[p]){mtr[q][j]='>';}}}}}}}word专业资料.}str.clear();for(i=0;i<lang.size();i++){ //ab aUb a=bfor(j=0;j<lang[i].right.size();j++){stringss=lang[i].right[j];stringok="";if(ss.length()>2){if((ss[1] > 'Z' ||ss[1] < 'A') && (ss[0] > 'Z' || ss[0] <'A')){ //aaok="";ok+=ss[0];ok+=ss[1];str.push_back(ok);}if((ss[2] > 'Z' ||ss[2] < 'A') && (ss[1] > 'Z' || ss[1] <'A')){ //aaok="";ok+=ss[1];ok+=ss[2];str.push_back(ok);}word专业资料.if((ss[2] > 'Z' ||ss[2] < 'A') && (ss[0] > 'Z' || ss[0] <'A')){ //aUaok="";ok+=ss[0];ok+=ss[2];str.push_back(ok);}}}}for(i=0;i<str.size();i++){for(j=1;j<9;j++){if(str[i][0]==mtr[j][0]){for(intk=1;k<9;k++){if(mtr[0][k]==str[i][1]){mtr[j][k]='=';}}}}}word专业资料.for(i=0;i<lang[0].first.size();i++){ //#for(j=1;j<9;j++){if(lang[0].first[i]==mtr[0][j]){mtr[8][j]='<';}}}for(i=0;i<lang[0].first.size();i++){//#for(j=1;j<9;j++){if(lang[0].first[i]==mtr[j][0]){mtr[j][8]='>';}}}mtr[8][8]='=';cout<<"****************************************"<<endl;for(i=0;i<9;i++){for(j=0;j<9;j++){if(mtr[i][j]!='n')cout<<mtr[i][j]<<" ";elsecout<<" ";word专业资料.}cout<<endl;}cout<<"****************************************"<<endl;cout<<endl;}voidtest(){cout<<"****************************************"<<endl;cout<<" 请输入算术表达式: "<<endl;stringstr;cin>>str;str+='#';inti,j,k;stack<int>data;stack<char>op;op.push('#');charnow='n';// 记录当前栈顶操作符intsign=0;for(i=0;i<str.length();i++){word专业资料.sign=0;if(str[i]>='0'&&str[i]<='9'){ //操作数inttemp=str[i]-'0';data.push(temp);}else{ //运算符op.push(str[i]);sign=1;}if(now!='n'&&sign==1){ //有可比性,并且操作符栈有更新if(!op.empty()){chartop=op.top(); //栈顶元素while(cmp(now,top)==1){ //需要规约intavg1=data.top();data.pop();intavg2=data.top();data.pop();out(now,avg2,avg1); //打印四元式data.p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年1 质量教学设计
- 给排水系统施工人员技术培训方案
- 2026中国国际工程咨询(北京)有限公司社会招聘5人备考题库【网校专用】附答案详解
- 9 电磁铁(一)教学设计小学科学五年级下册青岛版(五四制2024)
- 《圆的切线(2)》参考教案
- 汉江实验室2026届校园招聘备考题库附答案详解【培优b卷】
- 2026广东佛山南海区大沥镇盐步第三幼儿园招聘备考题库【考点精练】附答案详解
- 2026河北省中医院招聘护理人员40名考试参考试题及答案解析
- 2025-2026学年杜高打架教学设计素材app
- 2026年汉中洋县实验学校教师招聘(7人)考试参考试题及答案解析
- 2024年高考数学试卷(理科)(全国甲卷)【含解析】
- 济州岛旅游模板
- 取水许可管理办法变更申请书(空表)
- 2024中国中信金融资产管理股份有限公司广西分公司招聘笔试冲刺题(带答案解析)
- 2024年新改版青岛版(六三制)四年级下册科学全册知识点
- 鱼类性别控制技术研究进展专题培训课件
- 旧桥拆除专项施工方案
- GB/T 9978.2-2019建筑构件耐火试验方法第2部分:耐火试验试件受火作用均匀性的测量指南
- GB/T 17711-1999钇钡铜氧(123相)超导薄膜临界温度Tc的直流电阻试验方法
- 建设项目办理用地预审与选址意见书技术方案
- 研究生学术道德与学术规范课件
评论
0/150
提交评论