




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告学院(系)名称:计算机与通信工程学院姓名孟于杰学号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要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1掌握语法制导翻译的基本功能。2巩固对语义分析的基本功能和原理的认识。3能够基于语法制导翻译的知识进行语义分析。4掌握类高级语言中基本语句所对应的语义动作。5理解并处理语义分析中的异常和错误。实验要求:1在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2要求详细描述所选分析方法进行制导翻译的设计过程;3完成对所设计分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;6认真完成并按时提交实验报告。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】算符优先文法构造FIRSTVT、LASTVT、算符优先关系表:在构造FIRSTVT表时,通过循环找出每条产生式中的非终结符的FIRSTVT集,并把该非终结符和终结符压栈,设置标志位,标志一对非终结符和终结符具有对应关系。LASTVT表的构造则是将求FIRSTVT的过程翻转过来,可以仅仅将函数中的参数稍作修改就能够完成。算符优先关系表是一个二维数组,用来存放任意两个终结符之间的优先关系。首先构造表头,通过扫描所有产生式将终结符不重复的存放在一个一维数组中并置为优先关系表的行和列,并将优先关系表其他内容全部初始化为空。接着遍历所有产生式,找出任意两个终结符之间存在的关系(可以没有关系),并判断任意两终结符是否至多存在一种优先关系,如发现优先关系表不为空,则证明该文法不是算符优先文法,否则,将相应的关系填入到相应的行列对应的单元中。输入串分析过程的设计。首先将大于、小于、等于和无关系分别定义成一种类型的数据表示,通过查询符号栈栈顶以及当前符号之间的优先关系来判断移进和规约的操作。计算FirstVT和LastVT初始化是否是P-a.,断:文法的第四个字符是否属于终结符VT否是判断是否是P-Qa.是将P的位置和a的位置计算出,(P,a)入栈将P的位置和a的位置计算出,(P,a)入栈循环判断是否是P-Q.,将p-Q.中的P和(T,n)中的n入栈规约过程开始时,将#和文法开始符号放入栈底。总控程序在任何时候都是根据栈顶符号X和当前的输入符号进行工作的,它与文法无关 总控程序根据现行栈顶符号X和当前输入符号a,执行下列三种动作之一:1. 若Xa,则宣布分析成功,停止分析。2. 若Xa ,则把X从STACK栈顶逐出,让指针指向下一个输入符号。3.若X是一个非终结符,则查看分析表M。 若MX,a中存放着关于X的一个产生式,把X逐出STACK栈顶,把产生式的右部符号串按反序一一推进STACK栈(若右部符号为e,则意味不推什么东西进栈)。在把产生式的右部符号推进栈的同时应做这个产生式相应的语义动作。若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;char lower8=+,-,/,*,(,),i;void insert(char T,char n);/入栈操作bool SignArray2020;/标记数组,标记每一个是FIRSTVT、LastVTvoid CreateFIRSTVT(); /构造FIRSTVT的函数void PrintFirstvt();bool IsT(char); /判断是否为终结符bool IsN(char); /判断是否为非终结符程序结构:重要代码第15页 共15页void zh(int n)if(n=300)coutTn-300;elsecoutchar(n);int p(char n)if(n=)return 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;/标记数组,标记每一个是FIRSTVTvoid CreateFIRSTVT(); /构造FIRSTVT的函数 void PrintFirstvt();bool IsT(char); /判断是否为终结符bool IsN(char); /判断是否为非终结符private:string stack50;/栈int top;CreateFirstvt:CreateFirstvt()/初始化SignArraytop=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=upperj)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. 将P给pos1pos2=Ei.at(3);/p-a. 将a给pos2insert(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.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;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(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的类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+)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);stacktop+=);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,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(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(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 CreateLastvt: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;/算符优先关系表;CreatePreTable: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;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)PreTableGetLocation(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;elseif(IsT(Ei.at(j+3)=true)int loc=GetLocation(Ei.at(j+3);for(int m=0;m4;m+)for(int k=0;k;if(upperm=Ei.at(j+2)break;void CreatePreTable:PrintPreTable()cout*endl;cout打印算符优先文法的优先表:endl;cout*endl;cout + - / * ( ) iendl;cout+ ;for(int j=0;j8;j+)coutPreTable0j ;coutendl;cout- ;for(j=0;j8;j+)coutPreTable1j ;coutendl;cout/ ;for(j=0;j8;j+)coutPreTable2j ;coutendl;cout* ;for(j=0;j8;j+)coutPreTable3j ;coutendl;cout ;for(j=0;j8;j+)coutPreTable4j ;coutendl;cout( ;for(j=0;j8;j+)coutPreTable5j ;coutendl;cout) ;for(j=0;j8;j+)coutPreTable6j ;coutendl;couti ;for(j=0;j8;j+)coutPreTable7j ;coutendl;cout*endl;cout*endl;int CreatePreTable:GetLocation(char ch)/获得在VN的位置for(int i=0;i8;i+)if(loweri=ch)return i;class stackprivate:int size;char arraylength;public:stack()size=0;void push(char ch)if(sizelength)arraysize=ch; size+;elsecoutoverflow!=0)for(int i=0;ilen;i+)chi=arraysize-len+i; size-=len; return len;elsecout参数错误!=0&possize)return arraypos; return 0;void peekall()for(int i=0;igetsize();i+)coutpeek(i);cout=0&ch=a&ch=a&ch=(&ch=0&ch=9)return 1; return 0;void main()CreateFirstvt firstvt;firstvt.CreateFIRSTVT();firstvt.PrintFirstvt(); CreateLastvt lastvt;lastvt.CreateLASTVT();lastvt.PrintLastvt();CreatePreTable pretable;pretable.CreatePreCedentTable();pretable.PrintPreTable();char a1100;int b100;int atop=0,btop=0;string str;/char strmaxsize;stack s;/int len;cout请输入一个句型,以#结束!str;/len=int(strlen(str); s.push(#);int k=s.getsize()-1,t=0,j;char a=str0;while(a!=#)a=strt;if(isvt(s.peek(k) j=k;elsej=k-1; while(isvt(a)&getrank(s.peek(j),a)=1) int h=j,low=j-1;if(!isvt(s.peek(low)low-;while(getrank(s.peek(low),s.peek(h)!=-1)h=low;low-;if(!isvt(s.peek(low)low-;h=s.getsize()-1;low+;int len=h-low+1;char ch10;for(int p=0;p10;p+)chp=0;s.pop(ch,len);char c=guiyue(ch);s.push(c);coutch 规约为 guiyue(ch)=A&a=Z)&getrank(s.peek(j),a)=2)cout你的输入有错误!endl;cout错误为第 t+1个字符 :strtendl;exit(0);elsecout读入 :aendl;s.push(a);s.peekall();t+;k=s.getsize()-1;char temp10; s.pop(temp,3);if(s.getsize()=0)coutsuccessed!endl; else coutfail!k;/求四元式/for(int i=0;i1)if(stri=(&stri+1=-)cout(ss) ( uminus, ;zh(stri+2);cout, _, Tn-300
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030卡纳万病治疗学行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030医药制造行业发展分析及投资战略研究报告
- 2025-2030区域冷却能源系统行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030加热式足浴按摩器行业市场现状供需分析及投资评估规划分析研究报告
- 苏教版二年级语文下学期期末考试课堂检测
- 2025-2030内镜逆行胰胆管造影装置行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025-2030全球及中国高分辨率音频(音响发烧友音频)行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国逆向工程服务行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国药物运输技术行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国电动喷洗机行业供需现状及未来经营模式分析研究报告
- 酸枣仁汤的剂型研究
- 19J102-1 19G613混凝土小型空心砌块墙体建筑与结构构造
- 2023年福建泉州交发集团招聘考试真题及答案
- 2024届高考二轮复习备考 有机化学基础 课件(共35张)
- 设备移机方案报告
- 2022版义务教育(道德与法治)课程标准(附课标解读)
- 旅游行业的客户关系管理与维护
- 基于 Unity3D技术的农场体验游戏的设计与开发
- 缅怀革命先烈传承红色精神
- 水利工程建设标准强制性条文实施计划
- 保安人员职业素养课件
评论
0/150
提交评论