《天津理工大学编译原理实验3:语义分析与中间代码生成.docx》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验3:语义分析与中间代码生成.docx(12页珍藏版)》请在第壹文秘上搜索。
1、人4L大堂卖睑报告学院系名称:计算机与通信工程学院姓名*学号*专业计算机科学与技术班级*实验工程实验三:语义分析与中间代码生成课程名称编译原理课程代码0668056实嗡时间*实验地点计算机软件实验室7-219批改意见成绩教师签字:实验内容:可选择LLl分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法G曰如下所示:EE+TIE-TITTT*FIT/FIFfpfIPP(E)Ii要求构造出符合语义分析要求的属性文法描述,并在完成实验二语法分析的根底上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1 .掌握语法制导翻译的根本功能。2 .
2、稳固对语义分析的根本功能和原理的认识。3 .能够基于语法制导翻译的知识进行语义分析。4 .掌握类高级语言中根本语句所对应的语义动作。5 .理解并处理语义分析中的异常和错误。实验要求:1 .在实验二的根底上,实现语法制导翻译功能,输出翻译后所得四元式序列;2 .要求详细描述所选分析方法进行制导翻译的设计过程;3 .完成对所设计分析器的功能测试,并给出测试数据和实验结果;4 .为增加程序可读性,请在程序中进行适当注释说明;5 .整理上机步骤,总结经验和体会;6 .认真完成并按时提交实验报告。【实验过程记录源程序、测试用例、测试结果及心得体会等】分析的四元式:EE1+T(+,E1.place,T.p
3、lace,E.place)ETEl-T(-,E1.pIace,T.pIace,E.pIace)ET(=,T.place,E.place)TT1*F(*,T1.pIace,F.pIace,T.pIace)TT1F(rT1.pIacerF.pIacerT.pIace)TF(=rF.pIacef_rT.place)FPfC,P.pacerF.place)FP(=,P.place,F.place)PT(E)(=,E.place,P.place)Pi(=,lookup(i.name),P.place)根据语法分析修改的程序流程图程序运行结果:局部源代码:Mainxppftinclude#includeS
4、yntax,h”intmain(intargc,char*argv)(std:stringsource;std:cout*pleaseinputanarithmeticexpression”analysis();std:coutz,symbolStack:*inputStack:semStack:getSuccessO)syn-printSymbolO;sy11-printSourceO;syn-printSemanticO;syn-nextStep();std:coutstd:endl;)deletesyn;SyStem(pause);Lexical.h#PragnIaonce#includ
5、e#includenamespaceccygclassLexical(public:enumletter(add=O,sub=1,mul=2,div=3,pow=4,ide=5,Ief=6,rig=7,sha=8);LexicalO;Lexical(std:string);“LexicalO;boolanalysisO;voidprintSource();voidSetSourceCode(std:string);chartoChar(int);std:vectoridentifier;std:vectorsource;private:std:stringSourceCode;;LexicaL
6、cppJtinclude“Lexical,h”rtincludertincludeusingnamespaceccyg;Lexical:Lexical()()Lexical:Lexical(std:strings)(SourceCode=s;)Lexical:rLexical()boolLexical:analysisO(if(sourceCode.sizeO=0)(std:cout*sorceisempty!”std:endl;returnfalse;)source,clearO;identifier,clearO;intnumber=NULL;for(inti=0;i=*O*&source
7、Codei:source.push_back(sub);break;case,*:source.push_back(mul);break;case,*:source.push_back(div);break;,A,case:source.push_back(pow);break;case(:source.push_back(Ief);break;case):source.push_back(rig);break;default:std:cout”cannotidentify:SourceCodeistd:endl:returnfalse;break;)source.push_back(sha)
8、;returntrue;voidLexical:printSource()(for(inti=O;isource,sizeO;i+)(std:couttoChar(sourcei);)std:cout”;)charLexical:toChar(inta)(switch(a)(caseadd:return+;casesub:return,一;casemul:return*,;casediv:return;casepow:return:caseide:returni,;caseIef:return(;caserig:return);casesha:return#;default:break;)re
9、turnO;)voidLexical:SetSourceCode(std:stringsource)(SourceCode=source;)Syntax.hJtpragmaoncertincludeLexical,h”namespaceccyg(classSyntax:publicccyg:!Lexical(public:enumRelation定义优先关系枚举(equal=O,less=1,greater=2,错误i_i=3,i_left=4,leftsharp=5,right_i=6,right_left=7,sharp_right=8);enumSymbol(E=9,T=10,F=11,
10、P=12;Syntax(std:string=0);SyntaxO;boolreduced。;定义归约方法voidmovein();定义移进方法intfindOperator();查找最近运竟符chartoChar(int);boolnextStepO;voidinitNextO;voidPrintSymbolO;voidPrintSemanticO;boolgetSuccess();std:vectorSymbolStack;/定义符号栈std:vectorinputStack;/定义输入栈std:vectorsemStack;定义语义栈boolisSuccess;boolisInitNex
11、t;staticconstintpreArray99;SyntaxxppSincludeSyntax,h”Sincludeusingnamespaceccyg;constintSyntax:preArray99=2,2,1,1,lt1,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,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,8,0);longlongpoow(inta,intb)if(b=1
12、)(returna;)elsereturnpoow(a,b-l)*a;)Syntax:Syntax(std:strings):Lexical(s)isSuccess=false;isInitNext=false;)Syntax:SyntaxO()voidSyntax:moveinO(SymbolStack.push_back(source0);if(source0=ide)(semStack.push_back(identifier0);std:vector:iteratoriter=identifier,begin();identifier,erase(iter);)else(semStack.push_back(NULL);)std:vector