1、编译原理上机三学号成绩编译原理上机报告上机题目 编写语法分析分析器 上机时间 11月18日 学 院 信息与控制工程学院 专 业 计算机科学与技术 班 级 计算机1301班 姓 名 周砚豪 一、实验目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,并至少完成两个题目。2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。二、实验过程(一)根据分析法总控制流
2、程图,编写一个分析对象的语法分析程序。可根据自己的能力选择以下三项(由易到难)之一作为分析算法中的输入:1.直接输入根据已知文法人工构造的分析表M。2.输入已知文法的集合FIRST(x)和FOLLOW(U),由程序自动生成该文法的分析表M。3.输入已知文法,由程序自动生成该文法分析表M。?(二)程序具有通用性,即所编制的LL(1)语法分析程序能够适用于不同文法以及各种?输入单词串,并能判断该文法是否为算符文法和算符优先文法。?(三)有运行实例。对于输入的一个文法和一个单词串,所编制的语法分析程序应能正确地判断,此单词串是否为该文法的句子,并要求输出分析过程。?三、实验结果四、讨论与分析LL(1
3、)文法的判定:对于文法G的每一个非终结符U的产生式: U1|2|n。如果文法G是一个LL(1)文法,则有SELECT(Ui)SELECT(Uj)=(ij,i,j=1,2,n)。SELECT集的构造:SELECT(U)=?FIRST(),当不空FIRST()FOLLOW(U),否则LL(1)分析表构造算法:?对于每个产生式U,执行下一步骤:1、对于每个终结符号:aFIRST(),MU,a=?;?2、如果eFIRST(?),对于每个终结符号:bFOLLOW(U),MU,b=?;?3、将其它未定义的分析元素置为ERROR。五、附录:关键代码/*LL(1)分析法源程序,只能在VC+中运行 */#inc
4、lude#include#include#includechar 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,g1,s,s1,f,f1;/*结构体变量 */type C1010;
5、/*预测分析表 */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;/*用来接受Cmn*/ /*把文法产生式
6、赋值结构体*/ =E; strcpy,TG); =2; =T; strcpy,FS); =2; =G; strcpy,+TG); =3; =G; 0=; =1; =S; strcpy,*FS); =3; =S; 0=; =1; =F; strcpy,(E); =3; =F; 0=i; =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
7、;C43=f; printf(提示:本程序只能对由i,+,*,(,)构成的以#结束的字符串进行分析,n); printf(请输入要分析的字符串:); do/*读入分析串*/ scanf(%c,&ch); if (ch!=i) &(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); d
8、o 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,ch); ch=B+b;/*下一个输入字符*/ flag=0;/*恢复标记*/ /*if*/ el
9、se/*出错处理*/ 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,;/*输出产生式*/ for(j=0;j=0;j-)/*产生式逆序入栈*/ A+top=j; if(Atop=)/*为空则不进栈*/ top-; /*if*/ else/*出错处理*/ print(); print1(); printf(%c出错n,x);/*输出出错非终结符*/ exit(1); /*else*/ /*else*/ while(finish=0);/*main*/六、实验者自评 在LL(1)分析器的编写中我只达到了最低要求,就是自己手动输入的select集,first集,follow集然后通过程序将预测分析表构造出来了,并且没有做出对输入串的分析。通过本次试验,我能够设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。并且有能力选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2