1、南昌大学编译原理实验报告二南昌大学实验报告二实验类型:验证 综合设计 创新 实验日期:2013.5 实验成绩: 一、实验目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中递归下降分析方法。二、实验内容设计一个文法的递归下降分析程序,判断特定表达式的正确性。三、实验要求1、 给出文法如下:GE E-T|E+T; T-F|T*F; F-i|(E);2、 根据该文法构造相应的LL(1)文法及LL(1)分析表,并为该文法设计预测分析程序,利用C语言或C+语言实现;3、 利用预测分析程序完成下列功能:1) 手工将测试的表达
2、式写入文本文件,每个表达式写一行,用“;”表示结束;2) 读入文本文件中的表达式;3) 调用实验一中的词法分析程序搜索单词;4) 把单词送入预测分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息;5) 完成上述功能,有余力的同学可以进一步完成通过程序实现对非LL(1)文法到LL(1)文法的自动转换。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤1、 分析文法,将给出的文法转化为LL(1)文法;2、 学习预测分析程序的结构,设计合理的预测分析程序;3、 编写测试程序,包括表达式的
3、读入和结果的输出;4、 测试程序运行效果,测试数据可以参考下列给出的数据。六、测试数据 输入数据:编辑一个文本文文件expression.txt,在文件中输入如下内容: 10;1+2;(1+2)*3+(5+6*7);(1+2)*3+4;1+2+3+(*4+5);(a+b)*(c+d);(ab3+de4)*5)+1;正确结果:(1)10;输出:正确(2)1+2;输出:正确(3)(1+2)*3+(5+6*7);输出:正确(4)(1+2)*3+4输出:错误(5)1+2+3+(*4+5)输出:错误(6)(a+b)*(c+d)输出:正确(7)(ab3+de4)*5)+1输出:错误实验代码:以下分别用递归
4、下降和预测分析两种方法进行编程递归下降:#includeusing namespace std;char t100;char s100;int i, SIGN,j;void E();void E1();void E2();void T();void T1();void F();bool F1(char k);int main() cout请输入一个语句,以#号结束语句(直接输入#号推出)t; E2(); SIGN = 0; i=0; if( s0 = #) return 0; E(); if(si=#) cout正确语句!endl; cout请输入一个语句,以#号结束语句endl; retur
5、n 1;void E() if(SIGN=0) T(); E1(); void E1() if(SIGN=0) if(si=+) +i; T(); E1(); else if(si!=#&si!=) cout语句有误!endl; SIGN=1; void T() if(SIGN=0) F(); T1(); void T1() if(SIGN=0) if(si=*) +i; F(); T1(); else if(si!=#&si!=)&si!=+) cout语句有误!endl; SIGN=1; void F() if(SIGN=0) if(si=() +i; E(); if(si=) +i; e
6、lse if(si= #) cout语句有误!endl; SIGN=1; +i; else if(si=i) +i; else cout语句有误!=0&k=a&k=z)return true; else return false;实验截图:预测分析:#includeusing namespace std;char VT6=i,(,),*,+,#,;int ob56= 1,0,0,1,0,0, 0,1,0,0,2,2, 1,0,0,1,0,0, 0,2,1,0,2,2, 2,0,0,1,0,0;int p(char c) switch(c) caseE:return 0;break; caseB
7、:return 1;break; caseT:return 2;break; caseC:return 3;break; caseF:return 4;break; casei:return 0;break; case+:return 1;break; case*:return 2;break; case(:return 3;break; case):return 4;break; case#:return 5;break; default:return 6;break; bool V(char c) int i; for(i=0;i6;i+) if(c=VTi)return 1; retur
8、n 0;class LL1private: char s100; int j;public: LL1()s0=#;s1=E;j=1; char g()return sj; int gc()return j; void show()coutsjendl; void cj()j-; void change(int i) if(sj=E&i=1)sj+=B;sj=T; else if(sj=B&i=1)sj+=B;sj+=T;sj=+; else if(sj=B&i=2)j-; else if(sj=T&i=1)sj+=C;sj=F; else if(sj=C&i=1)sj+=C;sj+=F;sj=
9、*; else if(sj=C&i=2)j-; else if(sj=F&i=1)sj+=);sj+=E;sj=(; else if(sj=F&i=2)sj=i; else cout推导出错endl; ;void main() FILE *t; char in30; char a,c; coutin; if(t=fopen(in,r)!=NULL) break; else cout文件路径错误!请输入源文件名(包括路径和后缀名):; while(a=getc(t)!=EOF) LL1 S; cout原式a; if(p(a)=6)a=i;c=a; while(1) if(V(S.g() if(S
10、.g()=#&a=#)a=getc(t);break; else if(S.g()=a) S.cj(); while(1) c=a; a=getc(t); couta; if(a=;)a=#; if(p(a)=6)a=i; if(c!=i|a!=i)break; continue; else if(a=#)break; while(a!=;)a=getc(t);cout0) S.change(obp(S.g()p(a);continue; else if(a=#)break; while(a!=;)a=getc(t);couta; break; if(S.gc()=0)cout符合LL(1)文法endl; else a=getc(t);cout不符合LL(1)文法endl; system(pause);实验截图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1