天津理工大学编译原理实验3:语义分析与中间代码生成_第1页
天津理工大学编译原理实验3:语义分析与中间代码生成_第2页
天津理工大学编译原理实验3:语义分析与中间代码生成_第3页
天津理工大学编译原理实验3:语义分析与中间代码生成_第4页
天津理工大学编译原理实验3:语义分析与中间代码生成_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、程序运行结果:第2页共15页第 页共15页学院(系)名称:计算机与通信工程姓名*学号*专业计算机科学与技术班级*实验项目实验三:语义分析与中间代码生成课程名称编译原理课程代码0668056实验时间*实验地点计算机软件实验室7-219批改意见成绩教师签字:实验内容:可选择LL1分析法、文法GE如下所示:IIIIETE+TTTT*FFTP八FPT(E)E-TT/FPi算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。程序运行结果:第2页共15页第 #页共15页掌握语法制导翻译的基本功能。巩固对语义分析的基本功能和原理的认识。能够基于语法制导翻译的知识进行语义分析。掌握类高级语言

2、中基本语句所对应的语义动作。理解并处理语义分析中的异常和错误。要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:..4.5.6.实验要求:在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;要求详细描述所选分析方法进行制导翻译的设计过程;完成对所设计分析器的功能测试,并给出测试数据和实验结果;为增加程序可读性,请在程序中进行适当注释说明;整理上机步骤,总结经验和体会;认真完成并按时提交实验报告。【实验过程记录(源程序、测试用例、测试结果及心得体会等)

3、】分析的四元式:ETEl+T(+,E1.place,T.place,E.place)EtEiT(-,E1.place,T.place,E.place)EtT(=,T.place,_,E.place)TtTi*F(*,T1.place,F.place,T.place)TtTi/F(/,T1.place,F.place,T.place)TtF(二,F.place,_,T.place)FTPF(:P.place,F.place)FtP(二,P.place,F.place)Pt(E)(二,E.place,P.place)Pti(=,lookup(),_,P.place)程序运行结果:第2页共15页第

4、#页共15页程序运行结果:第2页共15页第 #页共15页根据语法分析修改的程序流程图|=归约压入语义栈从输入串获取字符与符号栈比较关系从标识符中查找数值将符号移进符号栈d:pragrammingC&C+-i-SemanticDebiLjgSemantk.exe第 页共15页第 #页共15页HEIt_-t538.83anali/sissuccessBtE-Ftt_22.1667_6561_22.1667_3_22.1667_3_22.1667_3_22.1667_3_8_22.1667_3_8i#itt#E-ittE-P#E-PA#E-PAi#E-PAP_23_10_12_23_10_12_23

5、_0.833333_22.it67_22.1667_#E-iAitt-iAi#-iAi#-iAl#iAi#P+PttP+P*#P+P*i#P+i5_3.5Pressanukeytocontinue.litIni-i33333333-_2_2_2_2_2_2_2_2ittittittittinittittittpleaseinputanari-tlineticexpression-/12-3A8#p+p*p#F+T*E-#E-#E-#E-ittE-(FBtE-P+BtE-P+iE-P+P#E-#includeSyntax.hintmain(intargc,char*argv)std:string

6、source;std:coutpleaseinputanarithmeticexpressionsource;ccyg:Syntax*syn=newccyg:Syntax(source);synanalysis();第 页共15页第 #页共15页std:coutsymbolstack:inputStack:semStack:getSuccess()syn-printSymbol();syn-printSource();syn-printSemantic();syn-nextStep();std:coutstd:endl;deletesyn;system(pause);Lexical.h#pra

7、gmaonce#includestring#includenamespaceccygclassLexicalpublic:enumletteradd=0,sub=1,mul=2,div=3,pow=4,ide=5,lef=6,rig=7,sha=8;Lexical();Lexical(std:string);Lexical();boolanalysis();voidprintSource();voidsetSourceCode(std:string);chartoChar(int);std:vectoridentifier;std:vectorintsource;private:std:str

8、ingsourceCode;;Lexical.cpp#includeLexical.h#include#includestdio.husingnamespaceccyg;Lexical:Lexical()Lexical:Lexical(std:strings)sourceCode=s;Lexical:Lexical()boolLexical:analysis()if(sourceCode.size()=0)std:coutsourceisempty!std:endl;returnfalse;source.clear();identifier.clear();intnumber=NULL;for

9、(inti=0;i=sourceCode.size();i+)if(i=sourceCode.size()if(number!=NULL)source.push_back(ide);identifier.push_back(number);number=0;source.push_back(sha);returntrue;第 页共15页第 #页共15页elseif(sourceCodei=O&sourceCodei=9)number=number*10+sourceCodei-48;elseif(number!=NULL)source.push_back(ide);identifier.pus

10、h_back(number);number=0;switch(sourceCodei)case+:source.push_back(add);break;case-:source.push_back(sub);break;case*:source.push_back(mul);break;case/:source.push_back(div);break;case:source.push_back(pow);break;case(:source.push_back(lef);break;case):source.push_back(rig);break;default:std:coutcann

11、otidentify:sourceCodeistd:endl;returnfalse;break;source.pushback(sha);第 页共15页第 #页共15页returntrue;voidLexical:printSource()for(inti=0;isource.size();i+)std:couttoChar(sourcei);std:cout;charLexical:toChar(inta)switch(a)caseadd:return+;casesub:return-;casemul:return*;casediv:return/;casepow:return;casei

12、de:returni;caselef:return(;caserig:return);casesha:return#;default:break;return0;voidLexical:setSourceCode(std:stringsource)sourceCode=source;Syntax.h#pragmaonce#includeLexical.hnamespaceccygclassSyntax:publicccyg:Lexicalpublic:enumRelation/定义优先关系枚举equal=0,less=1,greater=2,/错误i_i=3,i_left=4,left_sha

13、rp=5,right_i=6,right_left=7,sharp_right=8;enumSymbolTOC o 1-5 h zE=9,T=10,F=11,P=12;Syntax(std:string=0);Syntax();boolreduced();/定义归约方法voidmovein();/定义移进方法intfindOperator();/查找最近运算符chartoChar(int);boolnextStep();voidinitNext();voidprintSymbol();voidprintSemantic();boolgetSuccess();std:vectorsymbolSt

14、ack;/定义符号栈std:vectorinputStack;/定义输入栈std:vectorsemStack;/定义语义栈boolisSuccess;boolisInitNext;第 页共15页第 #页共15页staticconstintpreArray99;;Syntax.cpp#includeSyntax.h#includeusingnamespaceccyg;constintSyntax:preArray99=2,2,1,1,1,1,1,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,1,1,2,2

15、,2,2,2,2,2,3,4,2,2,1,1,1,1,1,1,1,0,5,2,2,2,2,2,6,7,2,2,1,1,1,1,1,1,1,&0longlongpoow(inta,intb)if(b=1)returna;elsereturnpoow(a,bT)*a;Lexical(s)Syntax:Syntax(std:strings):isSuccess=false;isInitNext=false;Syntax:Syntax()voidSyntax:movein()symbolStack.push_back(source0);if(source0=ide)semStack.push_back

16、(identifier0);std:vector:iteratoriter=identifier.begin();identifier.erase(iter);第 页共15页第 #页共15页3=E;semStacksemStack.size()3=E;semStacksemStack.size()3=T;elsesemStack.push_back(NULL);std:vectorint:iteratorit=source.begin();source.erase(it);boolSyntax:reduced()if(symbolStacksymbolStack.size()-1=ide)sy

17、mbolStacksymbolStack.size()-1=P;elseswitch(symbolStacksymbolStack.size()-2)caseadd:symbolStacksymbolStack.size()-symbolStack.pop_back();symbolStack.pop_back();semStacksemStack.size()-3=3+semStacksemStack.size()-1;semStack.pop_back();semStack.pop_back();break;casesub:symbolStacksymbolStack.size()-sym

18、bolStack.pop_back();symbolStack.pop_back();semStacksemStack.size()-3=3-semStacksemStack.size()-1;semStack.pop_back();semStack.pop_back();break;casemul:symbolStacksymbolStack.size()-symbolstack.pop_back();symbolstack.pop_back();semStacksemStack.size()-3=semStacksemStack.size()-3*semStacksemStack.size

19、()-1;semStack.pop_back();semStack.pop_back();break;casediv:symbolStacksymbolStack.size()-3=T;symbolStack.pop_back();symbolStack.pop_back();semStacksemStack.size()-3=(double)semStacksemStack.size()-3/(double)semStacksemStack.size()-1;semStack.pop_back();semStack.pop_back();break;casepow:symbolStacksy

20、mbolStack.size()-3=F;symbolStack.pop_back();symbolStack.pop_back();semStacksemStack.size()-3=poow(semStacksemStack.size()-3,semStacksemStack.size()-1);semStack.pop_back();semStack.pop_back();break;caselef:symbolStacksymbolStack.size()-2=E;symbolStack.pop_back();semStacksemStack.size()-2=semStacksemStack.size()-1;semStack.pop_back();std:vector:iteratorit=source.begin();source.erase(it);第 页共15页第 #页共15页returnF;caseP:returnP;default:std:couterror:unknownsymbolstd:endl;return0;voidSyntax:initNext()if(isInitNext=false)symbolStack,cl

温馨提示

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

评论

0/150

提交评论