资源描述:
《编译原理实验3ll(1)分析法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、实验目的与任务根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。二、实验涉及的相关知识点1、LL(1)分析法的功能LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。2、LL(1)分析法的前提改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法,3、LL(1)分析法实验设计思想及算法三、实验内容与过程程序输入/输出示例:对下列文法,用LL(1)分析法对任意输入的
2、符号串进行分析:(1)E->TG(2)G->+TG
3、—TG(3)G->ε(4)T->FS(5)S->*FS
4、/FS(6)S->ε(7)F->(E)(8)F->i四、实验结果及分析输出的格式如下:(1)LL(1)分析程序,编制人:姓名,学号,班级(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串(3)输出过程如下:步骤分析栈剩余输入串所用产生式1Ei+i*i#E->TG(4)输入符号串为非法符号串(或者为合法符号串)五、实验有关附件(如程序、附图、参考资料,等)/*LL(1)分析法源程序,只能在VC++中运行*/#in
5、clude#include#include#includecharA[20];/*分析栈*/charB[20];/*剩余串*/charv1[20]={'i','+','*','(',')','#'};/*终结符*/charv2[20]={'E','G','T','S','F'};/*非终结符*/intj=0,b=0,top=0,l;/*L为输入串长度*/typedefstructtype/*产生式类型定义*/{charorigin;/*大写字符*/chararray[
6、5];/*产生式右边字符*/intlength;/*字符个数*/}type;typee,t,g,g1,s,s1,f,f1;/*结构体变量*/typeC[10][10];/*预测分析表*/voidprint()/*输出分析栈*/{inta;/*指针*/for(a=0;a<=top+1;a++)printf("%c",A[a]);printf("tt");}/*print*/voidprint1()/*输出剩余串*/{intj;for(j=0;j
7、ntf("%c",B[j]);printf("ttt");}/*print1*/voidmain(){intm,n,k=0,flag=0,finish=0;charch,x;typecha;/*用来接受C[m][n]*//*把文法产生式赋值结构体*/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;g1.origi
8、n='G';g1.array[0]='^';g1.length=1;s.origin='S';strcpy(s.array,"*FS");s.length=3;s1.origin='S';s1.array[0]='^';s1.length=1;f.origin='F';strcpy(f.array,"(E)");f.length=3;f1.origin='F';f1.array[0]='i';f1.length=1;for(m=0;m<=4;m++)/*初始化分析表*/for(n=0;n<=5;n++)C[m][n].origin='N'
9、;/*全部赋为空*//*填充分析表*/C[0][0]=e;C[0][3]=e;C[1][1]=g;C[1][4]=g1;C[1][5]=g1;C[2][0]=t;C[2][3]=t;C[3][1]=s1;C[3][2]=s;C[3][4]=C[3][5]=s1;C[4][0]=f1;C[4][3]=f;printf("提示:本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析,");printf("请输入要分析的字符串:");do/*读入分析串*/{scanf("%c",&ch);if((ch!='i
10、')&&(ch!='+')&&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#')){printf("输入串中有非法字符");exit(1);}B[j]=c