《LL1分析文法.docx》由会员分享,可在线阅读,更多相关《LL1分析文法.docx(9页珍藏版)》请在三一办公上搜索。
1、LL1分析文法集 美 大 学 计 算 机 工 程 学 院 实 验 报 告 课程名称 编译原理 实验名称 LL分析文法 实验类型 设计型 姓名 学号 日期 地点 成绩 教师 评语: 一、 实验目的 l 根据某一文法编制调试LL分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL分析法的理解。 二、 实验环境 Microsoft Visual C+ 6.0 三、 实验设计思想 模块结构: 定义部分:定义常量、变量、数据结构。 初始化:设立LL(1)分析表、初始化变量空间; 控制部分:从键盘输入一个表达式符号串; 利用LL(1)分析算法进行表达式处理:根据LL(1)分析表
2、对表达式符号串进行堆栈操作,输出分析结果,如果遇到错误则显示错误信息。 表2-1 文法的分析表 非终结符 i E G T S F E-TG T-FS F-i + S- - S- * 输入符号 / ( E-TG T-FS F-(E) ) G- S- $ G- S- G-+TG G-TG S-*FS S-/FS 四、 实验内容 程序输入/输出示例: 对下列文法,用LL分析法对任意输入的符号串进行分析: E-TG G-+TG|TG G- T-FS S-*FS|/FS S- F-(E) F-i 输出的格式如下: (1)LL分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+*/i#
3、):在此位置输入符号串 (3)输出过程如下: 步骤 分析栈 剩余输入串 所用产生式 1 E i+i*i# E-TG (4)输入符号串为非法符号串(或者为合法符号串) 备注: (1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。 (2) 在此位置输入符号串为用户自行输入的符号串。 (3)上述描述的输出过程只是其中一部分的。 实验结果: 测试:i+i# 实验结果: 测试:i-i# 实验结果: 测试:i*i# 实验结果: 测试:i/i# 实验结果: 测试:i+(i*i)# 实验结果: 测试:i
4、-(i/i)# 实验结果: 测试非法输入字符串:i-i 实验结果: 测试非法输入字符串:i -i# 实验结果: 测试非法输入字符串:i+i)# 实验结果: 测试非法输入字符串:i-i-# 实验结果: 测试非法输入字符串:i-i-# 实验结果: 测试非法输入字符串:分析文法有了一定程度的掌握,加深了语法分析的原理和LL语法分析方法的理解,但是程序一开始仍旧有不完善的地方,本来应该出错的地方并未显示错误,比如以下测试,然后通过修改程序段是的程序得以正确执行。还有在推导LL(1)分析表的时候漏填了一部分的follow集,慢慢得出LL分析表的数据结构,程序得以正常运行。 六、 实验源程序 #inclu
5、de #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为输入串长度 */ typedef struct type/*产生式类型定义 */ char origin;/*大写字符 */ char array5;/*产生式右边字符 */ int length;/*字符个数 */ type; type e,t,g,g0,g1,s,s0,s1,f,f1;/*
6、结构体变量 */ 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=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;/
7、*用来接受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.length=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
8、=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.length=1; for(m=0;m=4;m+)/*初始化分析表*/ for(n=0;n=5;n+) Cmn.origin=N;/*全部赋为空*/ /*填充分析表*/ C00=e;C05=e; C11=g;C12=g0;C16=g1;C17=g1; C20=t;C25=t; C31=s1;C32=
9、s1;C33=s0;C34=s;C36=s1;C37=s1; C40=f1;C45=f; printf(提示:本程序只能对由i,+,-,*,/,(,)构成的以#结束的字符串进行分析,nn); printf(请输入要分析的字符串:); do/*读入分析串*/ scanf(%c,&ch); if (ch!=i) &(ch!=+)&(ch!=-) &(ch!=*)&(ch!=/)&(ch!=()&(ch!=)&(ch!=#) printf(输入串中有非法字符n); exit(1); Bj=ch; j+; while(ch!=#); l=j;/*分析串长度*/ ch=B0;/*当前分析字符*/ Ato
10、p=#; A+top=E;/*#,E进栈*/ printf(步骤tt分析栈 tt剩余字符 tt所用产生式 n); do x=Atop-;/*x为当前栈顶字符*/ printf(%d,k+); printf(tt); for(j=0;j=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=ch) print; print1; printf(%c匹配n
11、,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); /*main*/