




如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
(完整word版)编译原理预测分析法实验报告(C语言编写) (完整word版)编译原理预测分析法实验报告(C语言编写) (完整word版)编译原理预测分析法实验报告(C语言编写) 编译原理 实 验 报 告 实验名称:预测分析法 姓名: 专业班级:计科 学号: 指导老师: 日期:2011年6月1日 目的要求 构造文法的语法分析程序,要求采用预测分析法对输入的字符串进行语法分析。 加深对预测分析LL(1)分析法的理解和掌握。 实验内容 对文法G进行语法分析,文法G如下所示: *0. S→a*/ *1.S→^ *2. S→(T) *3. T→SW* *4.W→,SW *5. W→ε; 并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行预测分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。 程序输入/输出示例: 输入:一个以#结束的符号串:例如:(a,a)# 输出: 步数分析栈输入串所用规则 (1)#S(a,a))#2 源程序: //LL(1)预测分析控制程序 #include<stdio.h> #include<stdlib.h> #include<string.h> charstr[100];//存储待分析的句子 constcharT[]="a^(),#";//终结符,分析表的列符 constcharNT[]="STW";//非终结符,分析表的行符 /*指向产生式右部符号串*/ constchar*p[]={ /*0. S→a*/ "a", /*1.S→^ */"^", /*2. S→(T)*/ "(T)", /*3. T→SW*/ "SW", /*4.W→,SW*/ ",SW", /*5. W→ε;*/ "" }; //设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。 constintM[][6]={ /*a^(),#*/ /*S*/ {0,1,2,-1,-1,-1}, /*T*/ {3,3,3,-1,-1,-1}, /*W*/ {-1,-1,-1,5,4,-1} }; voidinit()//输入待分析的句子 { printf("请输入待分析的句子(以$结束):\n"); scanf("%s",str); } intlin(charc);//非终结符转换为行号 intcol(charc);//终结转换为列号 boolisNT(charc);//isNT判断是否是非终结符 boolisT(charc);//isT判断是否是终结符。 voidmain(void) { inti,j=0; intflag=1,flag2=0; charA; //设置指示句子的当前字符 charstack[20]= {'#','S'}; //栈赋初值 inttop=1; //设置栈顶指针 charX=''; //存储栈顶字符 init(); A=str[0]; printf("\t步数\t分析栈\t输入串\t所用规则\n"); //在屏幕上输出列表标题 while(1) { printf("\n\t(%d)\t",++j); //输出当前执行步数 for(i=0;i<=top;i++)//输出当前栈的内容(出栈前) { printf("%c",stack[i]); } printf("\t"); for(i=flag-1;str[i]!='$';i++) { printf("%c",str[i]); } if(flag2==1) { printf("\t%d",M[lin(X)][col(A)]); flag2=0; } //出栈 X=stack[top--]; if(X=='#')//是结束符 { if(X==A)//是结束符 { printf("\tAcc\n"); } elseprintf("\tERROR\n"); break; } elseif(isT(X))//是终结符 { A=str[flag++]; } elseif(isNT(X))//是否是非终结符 { flag2=1; //逆序入栈 for(i=strlen(p[M[lin(X)][col(A)]])-1;i>=0;i--) { stack[++top]=*(p[M[lin(X)][col(A)]]+i); } } else { pr

17****21
实名认证
内容提供者


最近下载