编译原理中LL(1)文法的源代码汇总_第1页
编译原理中LL(1)文法的源代码汇总_第2页
编译原理中LL(1)文法的源代码汇总_第3页
编译原理中LL(1)文法的源代码汇总_第4页
编译原理中LL(1)文法的源代码汇总_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上一. 实验目的1掌握LL(1分析法的基本原理2掌握LL(1分析表的构造方法3掌握LL(1驱动程序的构造方法二. 实验内容及要求根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。例:对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG(2)G->+TG|TG (3)G->(4)T->FS(5)S->*FS|/FS(6)S->(7)F->(E(8)F->i输出的格式如下:(1LL(1)分析程序,编制人:姓名,学号,班级(2输

2、入一以#结束的符号串(包括+*/()i#:在此位置输入符号串(3输出过程如下:步骤分析栈剩余输入串所用产生式1Ei+i*i#E->TG(4输入符号串为非法符号串(或者为合法符号串备注:(1在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。(2 在此位置输入符号串为用户自行输入的符号串。(3上述描述的输出过程只是其中一部分的。注意:1表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;2如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);3对学有余力的同学,测

3、试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;4可采用的其它的文法。三. 实验过程LL(1分析法的实验源程序代码如下:#include #include #include #include char A20;/*分析栈*/char B20;/*剩余串*/char v120='i','+','*','(','','#'/*终结符 */char v220='E','G','T

4、9;,'S','F'/*非终结符 */int j=0,b=0,top=0,l;/*L为输入串长度 */typedef struct type/*产生式类型定义 */char origin;/*大写字符 */char array5;/*产生式右边字符 */int length;/*字符个数 */type;type e,t,g,g1,s,s1,f,f1;/*结构体变量 */type C1010;/*预测分析表 */void print(/*输出分析栈 */int a;/*指针*/for(a=0;a<=top+1;a+printf("%c",

5、Aa;printf("tt"/*print*/void print1(/*输出剩余串*/int j;for(j=0;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&

6、quot;e.length=2;t.origin='T'strcpy(t.array,"FS"t.length=2;g.origin='G'strcpy(g.array,"+TG"g.length=3;g1.origin='G'g1.array0=''g1.length=1;s.origin='S'strcpy(s.array,"*FS"s.length=3;s1.origin='S's1.array0=''s1.lengt

7、h=1;f.origin='F'strcpy(f.array,"(E"f.length=3;f1.origin='F'f1.array0='i'f1.length=1;for(m=0;m<=4;m+/*初始化分析表*/for(n=0;n<=5;n+Cmn.origin='N'/*全部赋为空*/*填充分析表*/C00=e;C03=e;C11=g;C14=g1;C15=g1;C20=t;C23=t;C31=s1;C32=s;C34=C35=s1;C40=f1;C43=f;printf("提示:

8、本程序只能对由'i','+','*','(',''构成的以'#'结束的字符串进行分析,n"printf("请输入要分析的字符串:"do/*读入分析串*/scanf("%c",&ch;if (ch!='i' &&(ch!='+' &&(ch!='*'&&(ch!='('&&(ch!=''&&am

9、p;(ch!='#'printf("输入串中有非法字符n"exit(1;Bj=ch;j+;while(ch!='#'l=j;/*分析串长度*/ch=B0;/*当前分析字符*/Atop='#' A+top='E'/*'#','E'进栈*/printf("步骤tt分析栈 tt剩余字符 tt所用产生式 n"dox=Atop-;/*x为当前栈顶字符*/printf("%d",k+;printf("tt"for(j=0;j<

10、=5;j+/*判断是否为终结符*/if(x=v1j flag=1;break;if(flag=1/*如果是终结符*/if(x='#'finish=1;/*结束标记*/printf("acc!n"/*接受 */getchar(;getchar(;exit(1;/*if*/if(x=chprint(;print1(;printf("%c匹配n",ch;ch=B+b;/*下一个输入字符*/flag=0;/*恢复标记*/*if*/else/*出错处理*/print(;print1(;printf("%c出错n",ch;/*输出

11、出错终结符*/exit(1;/*else*/*if*/else/*非终结符处理*/for(j=0;j<=4;j+if(x=v2jm=j;/*行号*/break;for(j=0;j<=5;j+if(ch=v1jn=j;/*列号*/break;cha=Cmn;if(cha.origin!='N'/*判断是否为空*/print(;print1(;printf("%c->",cha.origin;/*输出产生式*/for(j=0;j printf("%c",cha.arrayj;printf("n"for(j=(cha.length-1;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;/*main*/程序的运行结果如下:四. 实验心得经过这个实验的练习,通过对程序的分析,让我进一步了解LL(1)算法的思想以及它的进一步程序实现,让我对它的了解从简单的理论上升到程序实现的级别,有理论上升到

温馨提示

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

评论

0/150

提交评论