编译原理实验二----LL_第1页
编译原理实验二----LL_第2页
编译原理实验二----LL_第3页
编译原理实验二----LL_第4页
编译原理实验二----LL_第5页
全文预览已结束

下载本文档

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

文档简介

1、实验二 LL(1)分析法一、实验目的:根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。二、实验内容:(1)请输出完整的分析过程,即详细输出每一步骤分析栈和剩余串的变化情况,及每一步所用的产生式。(2)请输出最终的分析结果,即输入串“合法”或“非法”。(3)示例程序只能完成+、-、*、(、)的语法分析,请加入-和/的语法分析。三、实验要求:实验规定对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E:=TG(2)G:=+TG(3)G:=(4)T:=FS(5)S:=*FS(6)S:=(7)F:=(E)

2、(8)F:=i若输入串为i+i*i# 则输出为: 步骤 分析栈 剩余串 产生式1#Ei+i*i# ETG2#GTi+i*i# TFS3#GSFi+i*i# Fi4#GSii+i*i# i5#GS+i*i# S6#G+i*i# G+TG7#GT+i*i# +.四、实验源代码:#include #include #include #include char A20;/*分析栈*/ char B20;/*剩余串*/ char v120=i,+,-,*,/,(,),#;/*终结符*/ char v220=E,G,T,S,F;/*非终结符*/ int j=0,b=0,top=0,l;/*L为输入串长度

3、*/ typedef struct type/*产生式类型定义*/ char origin;/*大写字符*/ char array7;/*产生式右边字符 */ int length;/*字符个数 */ type; type e,t,g,g0,g1,s,s0,s1,f,f1;/*结构体变量 */ type C1010;/*预测分析表 */ void print() /*输出分析栈 */ int a;/*指针*/ for(a=0;a=top+1;a+) printf(%c,Aa); printf(tt); /*print*/ void print1()/*输出剩余串*/ int j; for(j=

4、0;jb;j+)/*输出对齐符*/ printf( ); for(j=b;j=l;j+) printf(%c,Bj); printf(ttt); /*print1*/ void main() int m,n,k=0,flag=0,finish=0; char ch,x; type cha;/*用来接受Cmn*/ /*把文法产生式赋值结构体*/ e.origin=E; strcpy(e.array,TG); e.length=2; t.origin=T; strcpy(t.array,FS); t.length=2; g.origin=G; strcpy(g.array,+TG); g.leng

5、th=3; g0.origin=G; strcpy(g0.array,-TG); g0.length=3; g1.origin=G; g1.array0=; g1.length=1; s.origin=S; strcpy(s.array,*FS); s.length=3; s0.origin=S; strcpy(s0.array,/FS); s0.length=3; s1.origin=S; s1.array0=; s1.length=1; f.origin=F; strcpy(f.array,(E); f.length=3; f1.origin=F; f1.array0=i; f1.leng

6、th=1; for(m=0;m=4;m+)/*初始化分析表*/ for(n=0;n=7;n+) Cmn.origin=N;/*全部赋为空*/ /*填充分析表*/ C00=e;C05=e; C11=g; C12=g0; C16=g1;C17=g1; C20=t;C25=t; C31=s1;C32=s1;C33=s; C34=s0; C36=s1;C37=s1; C40=f1;C45=f; printf(提示:本程序只能对由i,+,-,*,/,(,)构成的以#结束的字符串进行分析,n); printf(请输入要分析的字符串:n); do/*读入分析串*/ scanf(%c,&ch); if (ch

7、!=i) &(ch!=+) &(ch!=-) &(ch!=*) &(ch!=/) &(ch!=() &(ch!=) &(ch!=#) printf(输入串中有非法字符n); exit(1); Bj=ch; j+; while(ch!=#); l=j;/*分析串长度*/ ch=B0;/*当前分析字符*/ Atop=#; A+top=E;/*#,E进栈*/ printf(步骤tt分析栈 tt剩余字符 tt所用产生式 n); do x=Atop-;/*x为当前栈顶字符*/ printf(%d,k+); printf(tt); for(j=0;j=7;j+)/*判断是否为终结符*/ if(x=v1j)

8、 flag=1; break; if(flag=1)/*如果是终结符*/ if(x=#) finish=1;/*结束标记*/ printf(合法n);/*接受 */ getchar(); getchar(); exit(1); /*if*/ if(x=ch) print(); print1(); printf(%c匹配n,ch); ch=B+b;/*下一个输入字符*/ flag=0;/*恢复标记*/ /*if*/ else /*出错处理*/ print(); print1(); printf(%c出错n,ch);/*输出出错终结符*/ exit(1); /*else*/ /*if*/ else /*非终结符处理*/ for(j=0;j=4;j+) if(x=v2j) m=j; /*行号*/ break; for(j=0;j,cha.origin); /*输出产生式*/ for(j=0;j=0;j-) /*产生式逆序入栈*/ A+top=cha.arrayj; if(Atop=) /*为空则不进栈*/ top-; /*if*/ /*出错处理*/ else print(); print1(); printf(%c出错n,x); /*输出出错非终结符*/ exit(1); /*else*/ /*else*/ while(finish=0); /*

温馨提示

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

评论

0/150

提交评论