聊城大学编译原理实验二语法分析器.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流聊城大学编译原理实验二语法分析器LIAOCHENG UNIVERSITY计算机学院实验报告【 2016 2017 学年第2学期】【一、基本信息】【实验课程】编译原理【设课形式】独立 非独立 Ö 【课程学分】4【实验项目】实验二语法分析器的设计【项目类型】基础 综合 Ö 设计 研究创新 其它 【项目学时】4【学生姓名】【学 号】【系别专业】软件开发【实验班组】级 班 组 台【同组学生】 【实验室名】综合实验楼【实验日期】【报告日期】【二、实验教师对报告的最终评价及处理意见】实验成绩: (涂改无效) 指导教师签名: 年 月 日注:要将实验项目、实验课程的成绩评定及课程考核办法明确告知学生,并报实验管理中心备案.精品文档.【三、实验预习】实验目的和要求:1. 掌握自上而下语法分析的基本思想;2. 掌握利用预测分析法进行语法分析的原理和过程;3. 熟悉文法的机内表示;4. 掌握语法分析器的设计与调试,提高编程能力、动手能力以及独立分析问题、解决问题的能力和综合运用所学知识的能力。实验内容和原理或涉及的知识点(综合性实验):1. 输入任意文法,改写文法使其成为LL(1)文法。 Ø2. 构造文法的预测分析表;3. 设计堆栈和预测分析表的机内表示;4. 设计并书写语法分析程序;5. 调试并运行语法分析程序;6. 实验结果分析l 分析程序中文法存储所采用的数据结构l 分析结果并写出自己的心得体会提示: 对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。 实验条件(实验设备、软件、材料等):1. 装有Codeblocks的电脑一台。2. 实验环境:WINDOWS下,工具为Turbo C2.0或Visual C 6.0。实验考核方式:1. 提交实验报告2. 演示程序和答辩(抽查)实验预习实验设计方案(实验方法、步骤、操作过程、设计型实验、实验数据记录表格):实验预习成绩(涂改无效)合格不合格【四、实验过程、数据和实验结果记录】实验方法、步骤、操作过程的记录描述或程序代码。实验过程中输入/输出数据、程序运行结果的记录。(可加附页)1. 输入任意文法,改写文法使其成为LL(1)文法。 答: 输入文法GE: E T|EAT T F|TMF F( E ) | i A+| -M* | /(1) 改写文法。对形如:UUx|y的产生式(其中x,y V+ ,y不以U开头),引入一个新的非终结符U后,可以等价地改写成为: UyU Ux U| 显然改写后,U和U都不是左递归的非终结符。因此文法GE按上述方法消去左递归后可等价地写成: ETP PAT P | TFW| W MFW| F( E ) | i M* | /2. 构造文法的预测分析表;i+-+/()#EE->TEE->TEEE->ATEE->ATEE->E->TT->FTT->FTTT->T->T->MFTT->MFTT->T->FF->iF->(E)AA->+A->MM->*M->/3. 设计堆栈和预测分析表的机内表示;堆栈表示: 预测分析表的机内表示:4. 设计并书写语法分析程序;语法分析程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<dos.h>char A20;char B20;char v120='i','+','*','(',')','#'char v220='E','G','T','S','F'int j=0,b=0,top=0,l;typedef struct type char origin; char array5; int length;type;type e,t,g,g1,s,s1,f,f1;type C1010;void print() int a; for(a=0;a<=top+1;a+) printf("%c",Aa); printf("tt");void print1() int j; for(j=0;j<b;j+) printf(" "); for(j=b;j<=l;j+) printf("%c",Bj); printf("ttt");void main() int m,n,k=0,flag=0,finish=0; char ch,x; type cha; 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.array0='' g1.length=1; s.origin='S' strcpy(s.array,"*FS"); s.length=3; s1.origin='S' s1.array0='' s1.length=1; f.origin='F' strcpy(f.array,"(E)"); f.length=3; f1.origin='F' f1.array0='i' f1.length=1; for(m=0;m<=4;m+) for(n=0;n<=5;n+) Cmn.origin='N' C00=e;C03=e; C11=g;C14=g1;C15=g1; C20=t;C23=t; C31=s1;C32=s;C34=C35=s1; C40=f1;C43=f; printf("提示:本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析,n"); printf("请输入要分析的字符串:"); do scanf("%c",&ch); if (ch!='i') &&(ch!='+') &&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#') printf("输入串中有非法字符n"); exit(1); Bj=ch; j+; while(ch!='#'); l=j; ch=B0; Atop='#' A+top='E' printf("步骤tt分析栈 tt剩余字符 tt所用产生式 n"); do x=Atop-; printf("%d",k+); printf("tt"); for(j=0;j<=5;j+) if(x=v1j) flag=1; break; 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=v2j) m=j; break; for(j=0;j<=5;j+) if(ch=v1j) n=j; break; cha=Cmn; if(cha.origin!='N') print(); print1(); printf("%c->",cha.origin); for(j=0;j<cha.length;j+) printf("%c",cha.arrayj); printf("n"); for(j=(cha.length-1);j>=0;j-) A+top=cha.arrayj; if(Atop='') top-; else print(); print1(); printf("%c出错n",x); exit(1); while(finish=0);5. 调试并运行语法分析程序;运行结果:输入i+(i*i)#运行结果如图一输入(i+i)*i#运行结果如图二记录成绩(涂改无效)合格不合格【五、实验结果分析】6. 实验结果分析通过本次实验加深对预测分析LL(1)分析法的理解,能撑握编写LL(1)分析程序对任意输入的符号串进行分析。