ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:172.52KB ,
资源ID:8427116      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8427116.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理ex3over.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理ex3over.docx

1、编译原理ex3over实验报告学院(系)名称:计算机与通信工程学院姓名孟于杰学号20091985专业计算机科学与技术班级2009级1班实验项目实验三:语义分析与中间代码生成课程名称编译原理课程代码0668056实验时间2012年5月11日 第1、2节2012年5月15日 第9、10节2012年5月18日 第1、2节实验地点计算机软件实验室7-219批改意见成绩教师签字: 实验内容:可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法GE如下所示:EE+T | E-T | TTT*F | T/F | FFPF | PP(E) | i要求构造出符合语义分析

2、要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1掌握语法制导翻译的基本功能。2巩固对语义分析的基本功能和原理的认识。3能够基于语法制导翻译的知识进行语义分析。4掌握类高级语言中基本语句所对应的语义动作。5理解并处理语义分析中的异常和错误。实验要求:1在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2要求详细描述所选分析方法进行制导翻译的设计过程;3完成对所设计分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;6认真完成

3、并按时提交实验报告。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】算符优先文法构造FIRSTVT、LASTVT、算符优先关系表:在构造FIRSTVT表时,通过循环找出每条产生式中的非终结符的FIRSTVT集,并把该非终结符和终结符压栈,设置标志位,标志一对非终结符和终结符具有对应关系。LASTVT表的构造则是将求FIRSTVT的过程翻转过来,可以仅仅将函数中的参数稍作修改就能够完成。算符优先关系表是一个二维数组,用来存放任意两个终结符之间的优先关系。首先构造表头,通过扫描所有产生式将终结符不重复的存放在一个一维数组中并置为优先关系表的行和列,并将优先关系表其他内容全部初始化为空。接

4、着遍历所有产生式,找出任意两个终结符之间存在的关系(可以没有关系),并判断任意两终结符是否至多存在一种优先关系,如发现优先关系表不为空,则证明该文法不是算符优先文法,否则,将相应的关系填入到相应的行列对应的单元中。输入串分析过程的设计。首先将大于、小于、等于和无关系分别定义成一种类型的数据表示,通过查询符号栈栈顶以及当前符号之间的优先关系来判断移进和规约的操作。计算FirstVT和LastVT否是是规约过程开始时,将#和文法开始符号放入栈底。总控程序在任何时候都是根据栈顶符号X和当前的输入符号进行工作的,它与文法无关 总控程序根据现行栈顶符号X和当前输入符号a,执行下列三种动作之一:1. 若X

5、a,则宣布分析成功,停止分析。2. 若Xa ,则把X从STACK栈顶逐出,让指针指向下一个输入符号。3.若X是一个非终结符,则查看分析表M。 若MX,a中存放着关于X的一个产生式,把X逐出STACK栈顶,把产生式的右部符号串按反序一一推进STACK栈(若右部符号为,则意味不推什么东西进栈)。在把产生式的右部符号推进栈的同时应做这个产生式相应的语义动作。若MX,a中存放着“出错标志”,则调用出错诊察程序ERROR。/要分析的文法string E10=E-E+T,E-E-T,E-T,T-T*F,T-T/F,T-F,F-PF,F-P,P-(E),P-i;char upper4=E,T,F,P;cha

6、r lower8=+,-,/,*,(,),i;void insert(char T,char n); /入栈操作bool SignArray2020; /标记数组,标记每一个是FIRSTVT、LastVTvoid CreateFIRSTVT(); /构造FIRSTVT的函数void PrintFirstvt();bool IsT(char); /判断是否为终结符 bool IsN(char); /判断是否为非终结符程序结构:重要代码void zh(int n) if(n=300) coutTn-300; else coutchar(n);int p(char n) if(n=) return

7、0; else if(n=) return 10; else if(n=+|n=-) return 20; else if(n=*|n=/) return 30; else if(n=() return 40; else return -1; class CreateFirstvt /构造FIRSTVT的类public: CreateFirstvt(); CreateFirstvt() void insert(char T,char n); bool SignArray2020; /标记数组,标记每一个是FIRSTVT void CreateFIRSTVT(); /构造FIRSTVT的函数 v

8、oid PrintFirstvt(); bool IsT(char); /判断是否为终结符 bool IsN(char); /判断是否为非终结符private: string stack50; /栈 int top;CreateFirstvt:CreateFirstvt()/初始化SignArray top=0; for(int i=0;i20;i+) for(int j=0;j20;j+) SignArrayij=false; void CreateFirstvt:insert(char T,char n) for(int j=0;j4;j+)/判断是否为VT,并标记位置 if(T=uppe

9、rj) break; for(int k=0;k8;k+)/判断是否为VN,并标记位置 if(n=lowerk) break; if(SignArrayjk=false) SignArrayjk=true; stacktop=(; stacktop.append(1,T); stacktop+=,; stacktop.append(1,n); stacktop+=); top+; /不在栈中,则将“(P,a)”入栈 void CreateFirstvt:CreateFIRSTVT() for(int i=0;ia.这种情况 char pos1,pos2; pos1=Ei.at(0); /P-a

10、. 将P给pos1 pos2=Ei.at(3); /p-a. 将a给pos2 insert(pos1,pos2); /a属于P的首符集 if(IsN(Ei.at(3) & Ei.length()4 & IsT(Ei.at(4) /处理P-Qa.这种情况 char pos1,pos2; pos1=Ei.at(0); pos2=Ei.at(4); insert(pos1,pos2); while(top!=0) /处理P-Q.这种情况 string PopElement=stack-top; stacktop=; char pos1,pos2; for(i=0;iQ.中的Q 相等 pos1=Ei.

11、at(0); /p-Q.的P和(T,n)中的n入栈 pos2=PopElement.at(3); insert(pos1,pos2); void CreateFirstvt:PrintFirstvt() cout*endl; cout打印文法的FIRSTVT:endlendl; cout文法的FIRSTVT(E):endl; for(int i=0;i4;i+) for(int j=0;j8;j+) if(SignArrayij=true & upperi=E) coutlowerj ; if(upperi=E) break; coutendl; cout文法的FIRSTVT(T):endl;

12、 for(i=0;i4;i+) for(int j=0;j8;j+) if(SignArrayij=true & upperi=T) coutlowerj ; if(upperi=T) /如果找到了,就退出本次循环 break; coutendl; cout文法的FIRSTVT(F):endl; for(i=0;i4;i+) for(int j=0;j8;j+) if(SignArrayij=true & upperi=F) coutlowerj ; if(upperi=F) break; coutendl; cout文法的FIRSTVT(P):endl; for(i=0;i4;i+) for

13、(int j=0;j8;j+) if(SignArrayij=true & upperi=P) coutlowerj ; if(upperi=P) break; coutendl;bool CreateFirstvt:IsT(char ch) for(int i=0;i8;i+) if(ch=loweri) return true; return false;bool CreateFirstvt:IsN(char ch) for(int i=0;i4;i+) if(ch=upperi) return true; return false;class CreateLastvt /构造LASTVT

14、的类public: CreateLastvt(); CreateLastvt() void insert(char T,char n); bool SignArray2020; void CreateLASTVT(); /构造LASTVT的函数 void PrintLastvt(); bool IsT(char); /判断是否为终结符 bool IsN(char); /判断是否为非终结符private: string stack50; int top;CreateLastvt:CreateLastvt() top=0; for(int i=0;i20;i+) for(int j=0;j20;j

15、+) SignArrayij=false; void CreateLastvt:insert(char T,char n) for(int j=0;j4;j+) if(T=upperj) break; /查出非终结符的位置 for(int k=0;k8;k+) if(n=lowerk) break; /查出终结符的位置 if(SignArrayjk=false) /如果再SignArray中没有,则将其入栈 SignArrayjk=true; stacktop=(; stacktop.append(1,T); stacktop+=,; stacktop.append(1,n); stackto

16、p+=); top+; /将(P,a)入栈 void CreateLastvt:CreateLASTVT() for(int i=0;i.a这种情况 char pos1,pos2; pos1=Ei.at(0); pos2=Ei.at(Ei.length()-1); insert(pos1,pos2); if(IsT(Ei.at(Ei.length()-2)=true & IsN(Ei.at(Ei.length()-1)=true) /处理P-.aQ这种情况 char pos1,pos2; pos1=Ei.at(0); pos2=Ei.at(Ei.length()-2); insert(pos1

17、,pos2); while(top!=0) /处理P-.Q这种情况 string PopElement=stack-top; stacktop=; char pos1,pos2; for(i=0;i10;i+) if(PopElement.at(1)=Ei.at(Ei.length()-1) pos1=Ei.at(0); pos2=PopElement.at(3); insert(pos1,pos2); void CreateLastvt:PrintLastvt() cout*endl; cout打印文法的LASTVT:endlendl; cout文法的LASTVT(E):endl; for(

18、int i=0;i4;i+) for(int j=0;j8;j+) if(SignArrayij=true & upperi=E) coutlowerj ; if(upperi=E) break; coutendl; cout文法的LASTVT(T):endl; for(i=0;i4;i+) for(int j=0;j8;j+) if(SignArrayij=true & upperi=T) coutlowerj ; if(upperi=T) break; coutendl; cout文法的LASTVT(F):endl; for(i=0;i4;i+) for(int j=0;j8;j+) if

19、(SignArrayij=true & upperi=F) coutlowerj ; if(upperi=F) break; coutendl; cout文法的LASTVT(P):endl; for(i=0;i4;i+) for(int j=0;j8;j+) if(SignArrayij=true & upperi=P) coutlowerj ; if(upperi=P) break; coutendl;bool CreateLastvt:IsT(char ch) for(int i=0;i8;i+) if(ch=loweri) return true; return false;bool C

20、reateLastvt:IsN(char ch) for(int i=0;i4;i+) if(ch=upperi) return true; return false;class CreatePreTablepublic: CreatePreTable(); CreatePreTable() void CreatePreCedentTable(); void PrintPreTable(); bool IsT(char); bool IsN(char); int GetLocation(char);private: char PreTable88; /算符优先关系表;CreatePreTabl

21、e:CreatePreTable()/初始化 for(int i=0;i8;i+) for(int j=0;j8;j+) PreTableij= ; bool CreatePreTable:IsT(char ch) for(int i=0;i8;i+) if(ch=loweri) return true; bool CreatePreTable:IsN(char ch) for(int i=0;i4;i+) if(ch=upperi) return true; void CreatePreTable:CreatePreCedentTable()/ CreateFirstvt firstvt;

22、firstvt.CreateFIRSTVT(); CreateLastvt lastvt; lastvt.CreateLASTVT(); for(int i=0;i10;i+) for(int j=1;j(Ei.length()-3);j+) if(IsT(Ei.at(j+2)=true) if(IsT(Ei.at(j+3)=true) PreTableGetLocation(Ei.at(j+2)GetLocation(Ei.at(j+3)=;/判定为等于关系 if(IsN(Ei.at(j+3)=true & j=(Ei.length()-5) & IsT(Ei.at(j+4)=true) P

23、reTableGetLocation(Ei.at(j+2)GetLocation(Ei.at(j+4)=;/判定为等于关系 if(IsN(Ei.at(j+3)=true) int loc=GetLocation(Ei.at(j+2); for(int m=0;m4;m+) for(int k=0;k8;k+) if(firstvt.SignArraymk=true & upperm=Ei.at(j+3) PreTablelock=; if(upperm=Ei.at(j+3) break; else if(IsT(Ei.at(j+3)=true) int loc=GetLocation(Ei.at(j+3); for(int m=0;m4;m+) for(int k=0;k8;k+) if(lastvt.SignArraymk=true & u

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1