天津理工大学编译原理实验3:语义分析与中间代码生成.docx
人4L大堂卖睑报告学院系名称:计算机与通信工程学院姓名*学号*专业计算机科学与技术班级*实验工程实验三:语义分析与中间代码生成课程名称编译原理课程代码0668056实嗡时间*实验地点计算机软件实验室7-219批改意见成绩教师签字:实验内容:可选择LLl分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法G曰如下所示:EE+TIE-TITTT*FIT/FIFfpfIPP(E)Ii要求构造出符合语义分析要求的属性文法描述,并在完成实验二语法分析的根底上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1 .掌握语法制导翻译的根本功能。2 .稳固对语义分析的根本功能和原理的认识。3 .能够基于语法制导翻译的知识进行语义分析。4 .掌握类高级语言中根本语句所对应的语义动作。5 .理解并处理语义分析中的异常和错误。实验要求:1 .在实验二的根底上,实现语法制导翻译功能,输出翻译后所得四元式序列;2 .要求详细描述所选分析方法进行制导翻译的设计过程;3 .完成对所设计分析器的功能测试,并给出测试数据和实验结果;4 .为增加程序可读性,请在程序中进行适当注释说明;5 .整理上机步骤,总结经验和体会;6 .认真完成并按时提交实验报告。【实验过程记录源程序、测试用例、测试结果及心得体会等】分析的四元式:EE1+T(+,E1.place,T.place,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<iostream>#include"Syntax,h”intmain(intargc,char*argv)(std:stringsource;std:cout«*pleaseinputanarithmeticexpression”<<std:endl;std:cin»source;ccyg:Syntax*syn=newccyg:Syntax(source);syn->analysis();std:cout«z,symbolStack:"«*inputStack:"<<"semStack:<<std:endl;while(!syn->getSuccessO)syn->printSymbolO;sy11->printSourceO;syn->printSemanticO;syn->nextStep();std:cout«std:endl;)deletesyn;SyStem("pause");Lexical.h#PragnIaonce#include<string>#include<vector>namespaceccygclassLexical(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:vector<int>identifier;std:vector<int>source;private:std:stringSourceCode;;LexicaLcppJtinclude“Lexical,h”rtinclude<iostream>rtinclude<stdio.h>usingnamespaceccyg;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<=sourceCode.sizeO;i+)(if(i=sourceCode.sizeO)(if(number!=NULL)(source.push_back(ide);identifier.push_back(number);number=0;)source.push_back(sha);returntrue;)elseif(sourceCodei>=*O*&&sourceCodei<='9')(number=number*10+sourceCodei-48;)else(if(number!=NULL)source.push_back(ide);identifier.push_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;,A,case:source.push_back(pow);break;case'(':source.push_back(Ief);break;case'):source.push_back(rig);break;default:std:cout«”cannotidentify:"«SourceCodei«std:endl:returnfalse;break;)source.push_back(sha);returntrue;voidLexical:printSource()(for(inti=O;i<source,sizeO;i+)(std:cout«toChar(sourcei);)std:cout«”;)charLexical:toChar(inta)(switch(a)(caseadd:return'+'casesub:return,一';casemul:return'*,;casediv:return''casepow:return:caseide:return'i,;caseIef:return'('caserig:return');casesha:return'#'default:break;)returnO;)voidLexical:SetSourceCode(std:stringsource)(SourceCode=source;)Syntax.hJtpragmaoncertinclude"Lexical,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,P=12;Syntax(std:string=0);SyntaxO;boolreduced。;定义归约方法voidmovein();定义移进方法intfindOperator();查找最近运竟符chartoChar(int);boolnextStepO;voidinitNextO;voidPrintSymbolO;voidPrintSemanticO;boolgetSuccess();std:vector<int>SymbolStack;/定义符号栈std:vector<int>inputStack;/定义输入栈std:vector<double>semStack;定义语义栈boolisSuccess;boolisInitNext;staticconstintpreArray99;SyntaxxppSinclude"Syntax,h”Sinclude<iostream>usingnamespaceccyg;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)(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<int>:iteratoriter=identifier,begin();identifier,erase(iter);)else(semStack.push_back(NULL);)std:vector<int>:iteratorit=source,beginO;source,erase(it);)boolSyntax:reducedO(if(symbolStacksymbolStack.sizeO-1=ide)(symbolStacksymbolStack.sizeO-1=P;)else(switch(symbolStacksymbolStack.sizeO-2)(caseadd:(symbolStacksymbolStack.sizeO-3=E;symbolStack.pop_backO;symbolStack.pop_backO;SemStackEsemStack.sizeO-3=semStacksemStack.sizeO-3+SemStackEsemStack.sizeO-1;semStack.pop_backO;semStack.pop_backO;break;)casesub:(symbolStacksymbolStack.sizeO-3=E;symbolStack.pop_backO;symbolStack.pop_backO;semStacksemStack.sizeO-3=SemStackEsemStack.sizeO-3-SemStackEsemStack.sizeO-1;semStack.pop_backO;semStack.pop_backO;break;)casemul:SymbolStacksymbolStack.sizeO-3=T;SymbolStack.pop_backO;symbolStack.pop_backO;semStacksemStack.sizeO-3=semStacksemStack.sizeO-3*SemStackEsemStack.sizeO-1;semStack.pop_backO;semStack.pop_backO;break;)casediv:symbolStacksymbolStack.sizeO-3=T;symbolStack.pop_backO;symbolStack.pop_backO;semStacksemStack.sizeO-3=(double)SemStackfsemStack.sizeO-3/(double)semStacksemStack.sizeO-1;semStack.pop_backO;semStack.pop_backO;break;)casepow:symbolStacksymbolStack.sizeO-3=F;symbolStack.pop_backO;symbolStack.pop_backO;(semStacksemStack.SemStackEsemStack.sizeO-3=poowsize()-3,SemStackEsemStack.sizeO-1);semStack.pop_backO;semStack.pop_backO;break;)caseIef:(symbolStacksymbolStack.sizeO-2=E;SymbolStack.pop_backO;semStacksemStack.sizeO-2=semStacksemStack.sizeO-1;semStack.pop_backO;std:vector<int>:iteratorit=source,beginO;source,erase(it);break;)casesha:(std:cout«”analysissuccess*«std:endl;returntrue;break;)returnfalse;intSyntax:IfindOperatorO(for(inti=symbolStack.sizeO-1;i>=O;i)(if(symboIStacki<E)(returnsymbolStacki;)return-1;charSyntax:toChar(inti)(charch=Lexical:toChar(i);if(ch!=O)(returnch;)switch(i)(caseE:(return'E')caseT:(return'T,;)caseF:(return'F;)caseP:(return'P')default:(std:cout«*error:unknownsymbol*«std:endl;)return0;)voidSyntax:initNextO(if(isInitNext=false)(SymbolStack.clear();SymbolStack.push_back(sha);semStack.clear();semStack.push_back(NULL);isSuccess=false;isInitNext=true;)boolSyntax:nextStepO(if(isSuccess=true)(returntrue;)if(IisInitNext)initNextO;)inta=findOperator();intb=source0;switch(preArrayab)caseless:(movein():break;)casegreater:(reducedO;break;)caseequal:isSuccess=reducedO;break;)returnisSuccess;voidSyntax:IprintSymbolO(for(inti=0;i<symbolStack.sizeO;i+)(std:cout«toChar(symbolStacki);)std:cout«”;boolSyntax:IgetSuccessO(returnisSuccess;)voidSyntax:ZprintSemanticO(for(inti=0;i<semStack.sizeO;i+)if(semStacki=NULL)(std:cout«';elsestd:cout«semStacki;)std:cout«”;2心得体会:这次实验做得还是不够理想,虽然做出了语法制导翻译的全过程,但是还有局部地方不够完美。例如四元式的使用及输出,不过总体来说,也算是深入的掌握了语法制导翻译的全过程,获益匪浅。