您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 聊城大学编译原理实验二语法分析器
1LIAOCHENGUNIVERSITY计算机学院实验报告【2016~2017学年第2学期】【一、基本信息】【实验课程】编译原理【设课形式】独立□非独立【课程学分】4【实验项目】实验二语法分析器的设计【项目类型】基础□综合设计□研究创新□其它[]【项目学时】4【学生姓名】【学号】【系别专业】软件开发【实验班组】级班组台【同组学生】【实验室名】综合实验楼【实验日期】【报告日期】【二、实验教师对报告的最终评价及处理意见】实验成绩:(涂改无效)指导教师签名:年月日注:要将实验项目、实验课程的成绩评定及课程考核办法明确告知学生,并报实验管理中心备案2【三、实验预习】实验目的和要求:1.掌握自上而下语法分析的基本思想;2.掌握利用预测分析法进行语法分析的原理和过程;3.熟悉文法的机内表示;4.掌握语法分析器的设计与调试,提高编程能力、动手能力以及独立分析问题、解决问题的能力和综合运用所学知识的能力。实验内容和原理或涉及的知识点(综合性实验):1.输入任意文法,改写文法使其成为LL(1)文法。2.构造文法的预测分析表;3.设计堆栈和预测分析表的机内表示;4.设计并书写语法分析程序;5.调试并运行语法分析程序;6.实验结果分析分析程序中文法存储所采用的数据结构分析结果并写出自己的心得体会提示:对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。实验条件(实验设备、软件、材料等):1.装有Codeblocks的电脑一台。2.实验环境:WINDOWS下,工具为TurboC2.0或VisualC6.0。实验考核方式:1.提交实验报告2.演示程序和答辩(抽查)实验预习实验设计方案(实验方法、步骤、操作过程、设计型实验、实验数据记录表格):实验预习成绩(涂改无效)合格□不合格□3【四、实验过程、数据和实验结果记录】①实验方法、步骤、操作过程的记录描述或程序代码。②实验过程中输入/输出数据、程序运行结果的记录。(可加附页)1.输入任意文法,改写文法使其成为LL(1)文法。答:输入文法G[E]:E→T|EATT→F|TMFF→(E)|iA→+|-M→*|/(1)改写文法。对形如:U→Ux|y的产生式(其中x,yV+,y不以U开头),引入一个新的非终结符U’后,可以等价地改写成为:U→yU’U’→xU’|ε显然改写后,U和U’都不是左递归的非终结符。因此文法G[E]按上述方法消去左递归后可等价地写成:E→TP’P’→ATP’|εT→FW’|εW’→MFW’|εF→(E)|iM→*|/2.构造文法的预测分析表;i+-+/()#EE-TEE-TE’E’E’-ATE’E’-ATE’E’-ƐE’-ƐTT-FT’T-FT’T’T’-ƐT’-ƐT’-MFT’T’-MFT’T’-ƐT’-ƐFF-iF-(E)AA-+A-MM-*M-/43.设计堆栈和预测分析表的机内表示;堆栈表示:预测分析表的机内表示:4.设计并书写语法分析程序;语法分析程序代码:#includestdio.h#includestdlib.h5#includestring.h#includedos.hcharA[20];charB[20];charv1[20]={'i','+','*','(',')','#'};charv2[20]={'E','G','T','S','F'};intj=0,b=0,top=0,l;typedefstructtype{charorigin;chararray[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(\t\t);}voidprint1(){intj;for(j=0;jb;j++)printf();for(j=b;j=l;j++)printf(%c,B[j]);printf(\t\t\t);}voidmain(){intm,n,k=0,flag=0,finish=0;6charch,x;typecha;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.origin='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';C[0][0]=e;C[0][3]=e;C[1][1]=g;C[1][4]=g1;C[1][5]=g1;7C[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','+','*','(',')'构成的以'#'结束的字符串进行分析,\n);printf(请输入要分析的字符串:);do{scanf(%c,&ch);if((ch!='i')&&(ch!='+')&&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#')){printf(输入串中有非法字符\n);exit(1);}B[j]=ch;j++;}while(ch!='#');l=j;ch=B[0];A[top]='#';A[++top]='E';printf(步骤\t\t分析栈\t\t剩余字符\t\t所用产生式\n);do{x=A[top--];printf(%d,k++);printf(\t\t);for(j=0;j=5;j++)if(x==v1[j]){flag=1;break;8}if(flag==1){if(x=='#'){finish=1;printf(acc!\n);getchar();getchar();exit(1);}if(x==ch){print();print1();printf(%c匹配\n,ch);ch=B[++b];flag=0;}else{print();print1();printf(%c出错\n,ch);exit(1);}}else{for(j=0;j=4;j++)if(x==v2[j]){m=j;9break;}for(j=0;j=5;j++)if(ch==v1[j]){n=j;break;}cha=C[m][n];if(cha.origin!='N'){print();print1();printf(%c-,cha.origin);for(j=0;jcha.length;j++)printf(%c,cha.array[j]);printf(\n);for(j=(cha.length-1);j=0;j--)A[++top]=cha.array[j];if(A[top]=='^')top--;}else{print();print1();printf(%c出错\n,x);exit(1);}}}while(finish==0);}105.调试并运行语法分析程序;运行结果:输入i+(i*i)#运行结果如图一输入(i+i)*i#运行结果如图二11记录成绩(涂改无效)合格□不合格□【五、实验结果分析】6.实验结果分析通过本次实验加深对预测分析LL(1)分析法的理解,能撑握编写LL(1)分析程序对任意输入的符号串进行分析。
本文标题:聊城大学编译原理实验二语法分析器
链接地址:https://www.777doc.com/doc-1822106 .html