您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 编译原理实验报告——实验二--递归下降分析
1编译原理实验报告实验名称:编写递归下降语法分析器实验类型:验证型实验指导教师:庄燕滨专业班级:10软件卓越姓名:黄子轩学号:10030416电子邮件:15251909800@139.com实验地点:秋白楼B705实验成绩:日期:2013年5月31日2一、实验目的通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的语法分析程序。二、实验过程1、分析对象分析算术表达式的BNF定义如下:〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉〈因式〉→〈变量〉│(〈算术表达式〉)〈变量〉→i用符号表示如下:E→T|E+T|E-TT→F|T*F|T/FF→i│(E)2、题目:编写递归下降语法分析器。3、要求:根据递归下降法分析法,完成上述算术表达式的分析器构造。主要完成:(1)通知外界键入算术表达式;(2)控制过程分析算术表达式;(3)根据分析结果正误,分别通知外界不同的信息。三、实验结果测试数据:i*i+i#实验结果:3四、讨论与分析根据递归下降法分析法和分析对象,可以得出下面的流程图。用递归下降法分析上述算术表达式的框图,如图3-4所示。这里,ZC过程为总控程序,主要完成:(a)通知外界键入算术表达式;(b)控制E过程分析算术表达式;(c)根据分析结果之正误,分别通知外界不同的信息。ZC过程被设计成可以分析无穷多个算术表达式。E、T和F三个过程分别对应〈算术表达式〉、〈项〉和〈因式〉三个产生式的处理。它们用到两个公共过程。一个是函数过程SYM,它负责从输入字符串ST中取出下一个字符,并存入SYM中等待分析。另一个过程ADVANCE负责剔除ST中的首字符。456五、附录:关键代码(给出适当注释,可读性高)/*判断加减*/intmyE(){printf(E-TE'\t\t);printf(#E'T\t\t);print();intp;p=myT();if(p){while(sym=='+'||sym=='-'){if(sym=='+'){printf(E'-+TE'\t);printf(#E'T+\t\t);print();}else{printf(E'--TE'\t);printf(#E'T-\t\t);print();}myAdvance();printf(\t\t);printf(#E'T\t\t);print();myT();return(1);}if(sym!='+'||sym!='-')7{printf(E'-^\t\t);printf(#\t\t);print();return(1);}}elsereturn(0);}/*判断乘除*/intmyT(){printf(T-FT'\t\t);printf(#E'T'F\t\t);print();intp;p=myF();if(p){while(sym=='*'||sym=='/'){if(sym=='*'){printf(T'-*FT'\t);printf(#E'T'F*\t\t);print();}else{printf(T'-/FT'\t);printf(#E'T'F/\t\t);print();}8myAdvance();printf(\t\t);printf(#E'T'F\t\t);print();myF();}if(sym!='*'||sym!='/'){printf(T'-^\t\t);printf(#E'\t\t);print();}return(1);}elsereturn(0);}/*判断是否是表达式或者括号*/intmyF(){intp;if(sym='A'&&sym='Z'||sym='a'&&sym='z'){printf(F-i\t\t);printf(#E'T'i\t\t);print();myAdvance();printf(\t\t);printf(#E'T'\t\t);print();return(1);}else{if(sym!='(')9{printf(error\n);return(0);tz=1;}else{printf(F-(E)\t\t);printf(#E'T'(E)\t);print();myAdvance();printf(\t\t);printf(#E'T'\t\t);print();p=myE();if(p)return(1);elsereturn(0);}if(sym!=')'){printf(error\n);tz=1;return(0);}else{printf(F-(E)\t\t);printf(#E'T'(E)\t);print();myAdvance();printf(\t\t);printf(#E'T'\t\t);10print();return(1);}}}/*移位*/voidmyAdvance(){inti;if(ipstrlen(st)){ip=ip+1;sym1();}}/*main函数*/voidmain(){gets(st);init();printf(所用产生式\t符号栈\t\t输入串\n);printf(\t\t);printf(#E\t\t);print();myE();if(sym!='#'||tz==1){printf(error\n);tz=0;}elseprintf(right\n);}六、实验者自评(主要从实验态度、方法、效果上给一个客观公正的自我评价)通过这次实验知道了递归下降分析的过程,刚开始这个程序我只是按照实验指导书上给出的流程图以及要求写了最简单的一种,但是不能把分析过程显示出来,并且还有地方有错,并没有达到老师要求。后来经过修改才体现了分析过程。11通过本次试验,我能够设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法,掌握了从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法,理解了词法分析的实现方法、
本文标题:编译原理实验报告——实验二--递归下降分析
链接地址:https://www.777doc.com/doc-5819045 .html