《编译原理上机三(共10页).docx》由会员分享,可在线阅读,更多相关《编译原理上机三(共10页).docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上学号成绩编译原理上机报告上机题目 编写语法分析分析器 上机时间 11月18日 学 院 信息与控制工程学院 专 业 计算机科学与技术 班 级 计算机1301班 姓 名 周砚豪 一、 实验目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,并至少完成两个题目。2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。二、 实验过程(一)根
2、据分析法总控制流程图,编写一个分析对象的语法分析程序。可根据自己的能力选择以下三项(由易到难)之一作为分析算法中的输入:1.直接输入根据已知文法人工构造的分析表M。2.输入已知文法的集合FIRST(x)和FOLLOW(U),由程序自动生成该文法的分析表M。3.输入已知文法,由程序自动生成该文法分析表M。?(二)程序具有通用性,即所编制的LL(1)语法分析程序能够适用于不同文法以及各种?输入单词串,并能判断该文法是否为算符文法和算符优先文法。?(三)有运行实例。对于输入的一个文法和一个单词串,所编制的语法分析程序应能正确地判断,此单词串是否为该文法的句子,并要求输出分析过程。?三、 实验结果四、
3、 讨论与分析LL(1)文法的判定:对于文法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
4、+中运行 */#include#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;/*结构体变量 */typ
5、e 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;/*用来接受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;C43=f; printf(提示:本程序只能对由i,+,*,(,
7、)构成的以#结束的字符串进行分析,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); do x=Atop-;/*x为当前栈顶字符*/ printf(%d,
8、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*/ else/*出错处理*/ print(); print1(); pri
9、ntf(%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集然后通过程序将预测分析表构造出来了,并且没有做出对输入串的分析。通过本次试验,我能够设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。并且有能力选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。专心-专注-专业