资源描述:
《编译原理实验二语法分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理实验报告实验二实验题目:语法分析指导老师:任姚鹏专业班级:计算机科学与技术系网络工程方向1002班姓名:杨飞(2010100246)2013年05月09日5实验类型验证性实验室_软件实验室二一、实验目的和任务:1.熟悉文法的机内表示;2.掌握利用预测分析法或递归子程序法进行语法分析的原理;3.掌握语法分析器的设计与调试。二、实验内容:1.语法分析和词法分析合在一起实现。2.把语法分析器设计成一个独立的过程。3.根据已建立的分析表,对下列输入串:i+i*i#进行语法分析,判断其是否符合文法。三、要求
2、:1.根据已有的文法规则建立LL(1)分析表;2.输出分析过程。四、实验代码:#include#include#includecharstr[100];//存储待分析的句子constcharT[]="a^(),#";//终结符,分析表的列符constcharNT[]="STW";//非终结符,分析表的行符/*指向产生式右部符号串*/constchar*p[]={/*0.S→a*/"a",/*1.S→^*/"^",/*2.S→(T)*/"(T)",/
3、*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()//输入待分析的句子5{printf("请输入待分析的句子(以$结束):");scanf("%s",str);}intlin(cha
4、rc);//非终结符转换为行号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分析
5、栈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
6、=stack[top--];if(X=='#')//是结束符{if(X==A)//是结束符{printf("tAcc");5}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)]]+
7、i);}}else{printf("Errorinmain()>%c",X);exit(0);}}}intlin(charc){for(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"
8、,c);exit(0);5}boolisNT(charc)//是否是非终结符{for(inti=0;i<(int)strlen(NT);i++){if(c==NT[i])returntrue;}returnfalse;}boolisT(charc)//是否是终结符(不包括'#'){for(inti=0;i<(int)strlen(T)-1;i++){if(c==T[i]){returntrue;}}returnfalse;}五