《2022年实验三递归下降语法分析器定义 .pdf》由会员分享,可在线阅读,更多相关《2022年实验三递归下降语法分析器定义 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、湖南农业大学东方科技学院学生实验报告姓名:刘亚南学号 200841903329 年级专业及班级08 级 计算机(3 )班成绩课程名称编译原理实验名称3递归下降分析法实验目的、要求了解语法分析器的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法。实验内容、原理算术表达式的文法可以是(可以根据需要适当改变): EE+E|E-E|E*E|E/E|(E)|i 根据递归下降分析法或预测分析法,对表达式进行语法分析,判断一个表达式是否正确。实验环境计算机 vc+ 软件实验步骤(1)准备: 1. 阅读课本有关章节,确定算术表达式的文法;( 设计出预测分析表);2. 考虑好设计
2、方案;3. 设计出模块结构、测试数据,初步编制好程序。(2)上机调试,发现错误,分析错误,再修改完善。教师根据学生的设计方案与学生进行探讨,以修改方案和代码。(3)改造后的文法:EE+T|E-T|T TT*F|T/F|F FFP|P Pc|id|(E) (4)程序代码:#include #include #include #include #include void error(); void terror(); void Scanner(); char sym = ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整
3、理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - int i=0; char strToken30= ; FILE *in; void E(); void E1(); void F(); void Retract(char str30) for(int j=0;j30;j+) strj=0; void Scanner() sym=fgetc(in); if(isspace(sym) while(1) if(isspace(sym) sym=fgetc(in); else break; if(isdigit(sym) while(1) if(isdigi
4、t(sym) strTokeni=sym; i+; sym=fgetc(in); else printf(%s,strToken); i=0; Retract(strToken); fseek(in,-2,1); sym=fgetc(in); break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - else if(sym=+) printf(+); else if(sym=-) printf(-); else if(sym
5、=*) printf(*); else if(sym=/) printf(/); else if(sym=) printf(); else if(sym=() printf(); else if(sym=) printf(); void F() if(isdigit(sym) Scanner(); else if(sym=() Scanner(); E(); if(sym=) Scanner(); else error(); else terror(); void T1() if(sym=*|sym=/|sym=) Scanner(); F(); 名师资料总结 - - -精品资料欢迎下载 -
6、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - T1(); void T() F(); T1(); void E1() if(sym=+|sym=-) Scanner(); T(); E1(); void E() T(); E1(); void error() printf( This is the wrong phrase!n); exit(0); void terror() printf( This is the wrong phrase2!n); exit(0); v
7、oid main() if(in=fopen(input.txt, r)=NULL) printf(THE FILE DOESNT OPEN!); exit(0); Scanner(); E(); if(sym=#) printf(nsuccessn); else printf(fail); fclose(in); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - 实验调试过程及测试结果程序输入 /输出示例:如参考 C语言的运算符
8、。输入如下表达式(以分号为结束)和输出结果:(a)10; 输出:正确此时程序运行结果如下图:(b)1+2; 输出:正确此时程序运行结果如下图:(c)(1+2)/3+4-(5+6/7); 输出:正确此时程序运行结果如下图:(d)(1-2)/3+4 输出:错误此时程序运行结果如下图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - (e)1+2-3+(*4/5) 输出:错误此时程序运行结果如下图:(f )(1+2)/3+4-(5+6/7)-23; 输出:正确此时程序运行结果如下图:(g)(1+2)/3+4-(5+6/7)-; 输出:正确此时程序运行结果如下图:总结通过该实验的操作,我了解了语法分析器的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法;了解了也理解了递归下降分析法的基本原理, 在试验前听了老师的细心讲解, 试验起来觉得没有太大难度。指导教师签名:2010 年月日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -