资源描述:
《编译原理语法分析程序设计(预测分析法)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1.实验目的构造文法的语法分析程序实验要求,2.实验要求采用预测分析法对输入的字符串进行语法分析。3.实验环境VC++6.04.实验原理对文法G进行语法分析,文法G如下所示:*0.S→a*/*1.S→^*2.S→(T)*3.T→SW**4.W→,SW*5.W→ε;5.软件设计与编程#include#include#includecharstr[100];//存储待分析的句子constcharT[]="a^(),#";//终结符,分析表的列符constcharNT[]="STW";//非终结符,分析表的行符/*指向产
2、生式右部符号串*/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("请输入待分析的句子(以$结束)
3、:");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分析栈
4、t输入串t所用规则");//在屏幕上输出列表标题while(1){printf("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
5、==A)//是结束符{printf("tAcc");}elseprintf("tERROR");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{printf("Errorinmain()>%c",X);exit(0);}}}intlin(charc){for(
6、inti=0;i<(int)strlen(NT);i++){if(c==NT[i]){returni;}}printf("Errorinlin()>%c",c);exit(0);}intcol(charc){for(inti=0;i<(int)strlen(T);i++){if(c==T[i])returni;}printf("Errorincol()>%c",c);exit(0);}boolisNT(charc)//是否是非终结符{for(inti=0;i<(int)strlen(NT);i++){if(c==NT[i])returntrue;}returnfa
7、lse;}boolisT(charc)//是否是终结符(不包括'#'){for(inti=0;i<(int)strlen(T)-1;i++){if(c==T[i]){returntrue;}}returnfalse;}1.程序测试结果