北邮编译原理LL(1)语法分析程序.docx_第1页
北邮编译原理LL(1)语法分析程序.docx_第2页
北邮编译原理LL(1)语法分析程序.docx_第3页
北邮编译原理LL(1)语法分析程序.docx_第4页
北邮编译原理LL(1)语法分析程序.docx_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

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

文档简介

LL(1)语法分析程序2010211306班 赵雪莹(10211310)语法分析程序:该语法分析程序实现对算术表达式的语法分析,并且在对输入表达式进行分析的过程中,输出所采用的产生式。该程序使用的是LL(1)语法分析程序,为给定文法构造预测分析表,并通过预测分析表对输入的表达式进行预测分析,并将栈顶状态和预测分析过程详细输出,如果匹配成功则接受,如果匹配不成功则返回错误信息。给定文法的产生式:E-E+T | E-T | TT-T*F | T/F | FF- id | (E) | num源代码:#include #include #include #include #include using namespace std;struct Node1 char vn; char vt; char s12;MAP22;/存储分析预测表每个位置对应的终结符,非终结符,产生式 int k;char G1212=E-TR,R-+TR,R-TR,R-e,T-FW,W-*FW,W-/FW,W-e,F-(E),F-i,F-n;/存储文法中的产生式 ,用R代表E,W代表T,e代表空char VN6=E,R,T,W,F;/存储非终结符 char VT9=i,n,+,-,*,/,(,),#;/存储终结符 char FOLLOW1212=(,i,n,+,-,),#,(,i,n,*,/,+,-,),#,(,i,n;/存储文法中每个产生式对应的FOLLOW集合 char Right128=-TR,-+TR,-TR,-e,-FW,-*FW,-/FW,-e,-(E),-i,-n;stack stak,stak1,stak2;bool compare(char *a,char *b) int i,la=strlen(a),j,lb=strlen(b); for(i=0;ila;i+) for(j=0;jlb;j+) if(ai=bj) return 1; return 0;char *Find(char vn,char vt) int i; for(i=0;ik;i+) if(MAPi.vn=vn & MAPi.vt=vt) return MAPi.s; return error;char * Analyse(char * word) char p,c,action10,output10; int i=1,l=strlen(word),j,k=0,l_act,m,x; printf(_n); printf(n 对符号串%s的分析过程n,word); for(x=0;xl;x+)/把用字母数字表示的输入串转换为token序列的表示方法 c=wordx; if(c=a)|(c=A) wordx=i; else if(c=0&c=9) wordx=n; else wordx=c; while(!stak.empty()/判断栈中是否为空,若不空就将栈顶元素与分析表匹配进行相应操作 stak.pop(); stak.push(#);/栈底标志 stak.push(E);/起始符号先入栈 printf( 步骤 栈顶元素 输入串 推到所用产生式或匹配n); p=stak.top(); while(p!=#)/查预测分析表将栈顶元素进行匹配,若栈顶元素与输入串匹配成功则向前匹配,否则生成式反序入栈 printf(%7d ,i+); p=stak.top();/从栈中弹出一个栈顶符号,由p记录并输出 stak.pop(); printf(%6c ,p); for(j=k,m=0;j1;j-) stak.push(actionj); if(strcmp(output,#)!=0)/匹配不成功 return ERROR; int main () freopen(in.txt,r,stdin); char source100; int i,j,flag,l,m; printf(n*R代表E,W代表T,e代表空*nn); printf(算术表达式对应的文法产生式如下:n); for(i=0;i8;i+) printf( %sn,Gi); printf(_n); printf(n该文法的FOLLOW集如下:n); /手动生成集合 for(i=0;i8;i+) printf( FOLLOW(%s) = %s n,Gi,FOLLOWi); printf(_n); for(i=0,k=0;i11;i+)/通过集合生成预测分析表 l=strlen(FOLLOWi); for(j=0;jl;j+=2) MAPk.vn=Gi0; MAPk.vt=FOLLOWij; strcpy(MAPk.s,Righti); k+; printf(n表达式文法的预测分析表如下:nn); printf( ); for(i=0;i9;i+) printf(%7c,VTi); printf(n); for(i=0;i5;i+) printf( -n); printf(%7c,VNi); for(j=0;j9;j+) for(m=0;msource)/输入源文件串进行预测分析 printf(n分析结果:%snn,Analyse(source); while(1); return 0;将其改写LL(1)文法:

温馨提示

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

评论

0/150

提交评论