欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    天津理工大学编译原理实验3:语义分析与中间代码生成.docx

    • 资源ID:908686       资源大小:34KB        全文页数:12页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    天津理工大学编译原理实验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心得体会:这次实验做得还是不够理想,虽然做出了语法制导翻译的全过程,但是还有局部地方不够完美。例如四元式的使用及输出,不过总体来说,也算是深入的掌握了语法制导翻译的全过程,获益匪浅。

    注意事项

    本文(天津理工大学编译原理实验3:语义分析与中间代码生成.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开