实验二语法分析算符优先法.doc_第1页
实验二语法分析算符优先法.doc_第2页
实验二语法分析算符优先法.doc_第3页
实验二语法分析算符优先法.doc_第4页
实验二语法分析算符优先法.doc_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华北水利水电学院编译原理实验报告20132014学年 第 一 学期 2012 级 计算机科学与技术 专业班级: 196 学号: 2012196 姓名: 李明月 一、 实验题目:算符优先分析程序二、 实验内容:(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表 输出到屏幕或者输出到文件);(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)(3)给定表达式文法为: G(E): E#E#EE+T | TTT*F |FF(E)|i(4)分析的句子为: (i+i)*i和i+i)*i三、 程序源代码:第 6 页 共 6 页#include#include#include#includechar oppriority66=,$,$,$,$,#E#n); printf(EE+T|Tn);printf(TT*F|Fn); printf(F(E)|in);printf(文法可拆分为:n);printf(0)E-#E#n);printf(1)E-E+Tn);printf(2)E-Tn);printf(3)T-T*Fn);printf(4)T-Fn);printf(5)F-(E)n);printf(6)F-in);printf(根据FIRSTVT集和LASTVT集可以得出算符优先分析表。n); printf(-n);printf( 算符优先关系表n); printf( + * i ( ) #n); printf( + n); printf( * n); printf( i n); printf( ( n); printf( # =n);printf(-n);printf(请输入要进行分析的句子(以#号结束输入):n); gets(storage);/将输入的字符串存到数组中printf(步骤 栈 当前符号 剩余输入串 移进或归约n);k=0;Stackk=#;Stackk+1=0;int length,i; /初始化剩余字符串数组为输入串length=strlen(storage);/for(i=0;ilength;i+) remaini=storagei;remaini=0;judge();/对所输入的句子进行算符优先分析过程的函数void judge()/对所输入的句子进行算符优先分析过程的函数int i,j,f,z,z1,n,n1,z2,n2;int count=0;/操作的步骤数char a; /用于存放正在分析的字符char p,Q,p1,p2;f=strlen(storage); /测出数组的长度for(i=0;i) for( ; ; ) Q=Stackj; if(Stackj-1=+|Stackj-1=*|Stackj-1=i|Stackj-1=(|Stackj-1=)|Stackj-1=#) j=j-1; else j=j-2; z1=located(Stackj); n1=located(Q); p1=oppriorityz1n1; if(p1=) /把AnalyseStackj+1AnalyseStackk归约为N count+; printf(%d) %st%8c%17st 归约n,count,Stack,a,remain); k=j+1; i-; Stackk=E; int r,r1; r=strlen(Stack); for(r1=k+1;r1r;r1+) Stackr1=0; break; else continue;elseif(p=) /表示移进count+;printf(%d) %st%8c%17st 移进n,count,Stack,a,remain);k=k+1;Stackk=a;change();elseif(p=)z2=located(Stackj);n2=located(#);p2=oppriorityz2n2;if(p2=)count+;printf(%d) %st%8c%17st 接受n,count,Stack,a,remain);printf(该句子是该文法的合法句子。n);break;elsecount+;printf(%d) %st%8c%17st 移进n,count,Stack,a,remain);k=k+1;Stackk=a;change();elseprintf(错误!该句子不是该文法的合法句子!n);break; int located(char x) /查出某个字符在优先表中的位置int m;if(x=+)m=0;if(x=*)m=1;if(x=i)m=2;if(x=()m=3;if(x=)m=4;if(x=#)m=5;return m;void change()/将后一个字符往前移动int i,j;i=strlen(remain);for(j=0;ji;j+)remainj=remainj+1;remaini-1=0;四、 测试结果:五、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)这次实验,真的感觉非常困难,在网上查了好久,又看了好久,才明白,在本次实验中,深刻的体会到了,自己在动手这方面的不足之处,在做这次实验的时候,又看了下课本,把内容又进行了复习,让我对算符优先分析算法的设计过程有了更深一层的了解:即先对已给定的文法按其产生式构

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论