递归下降语法分析器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)分析对象
分析算术表达式的 BNF 定义如下: 〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉 〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉 〈因式〉→〈变量〉│(〈算术表达式〉) 〈变量〉→i 用符号表示如下:
E→T|E+T|E-T T→F|T*F|T/ F→i│(E) 递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因 为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。
else printf("right\n");
} 六、实验者自评 通过本次对递归下降词法分析器的结构,过程有了更进一步的了解,通过学习书本和试验原 理书上的内容,对它的工作原理,具体实行步骤有了进一步的掌握,由于本次试验是测试性 试验,所以要求输出的结果是成功与否,输入一个句型,进过分析,判断它是否合法,主要 内容在于其判断过程中。本次试验不光提高了自己的编程能力,同时提高了对递归下降的了 解。
生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。
无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于任一非终结符号 U 的产生式右部 x1|x2|…|xn,其源自文库应的字的首终结符 号 两两不相交。
三试验结果
myT(); if (sym=='+'||sym=='-') {
myAdvance(); myE(); } } void myT() { myF(); while( sym=='*'||sym=='/') { myAdvance(); myF();
} } void myF() {
if (sym >= 'A' && sym <= 'Z' || sym >= 'a' && sym <= 'z' ) myAdvance();
if (ip < strlen(st)) { ip = ip + 1; sym = st[ip]; } }
void init() { ip = 0; sym = st[ip]; } void main() { int i;
gets(st); for(i=0;st[i]!='\0';i++); st[i]='#'; init(); myE(); if (sym!='#' || tz==1) { printf("error\n"); tz = 0; }
else{ if (sym !='(' ) { printf("error\n"); tz = 1;
} else {myAdvance();
myE();} if (sym != ')' ) { printf("error\n"); tz = 1;} else myAdvance();
} } void myAdvance() {
四、讨论和分析 本次试验分为 5 个大步骤: 1、ZC 过程:开始,然后打印“INPUT EXPRESSION”,输入字符串 ST,执行 E 过程,然 后判断 SYM 是否不等于#或者 TZ 是否等于 1,如果是,打印“ERROR AGAIN”,给 TZ 赋 值为 0,跳回到开始步骤继续;如果不是则打印“RIGHT AGAIN”,回到开始步骤继续。 2、E 过程:开始,执行 T 过程,判断 SYM 是否等于“+”或“—”,如果不是,返回,如 果是,执行 ADVANCE,跳回到开始步骤。 3、T 过程:开始,执行 F 过程,判断 SYM 是否等于“*”或者“/”,如果不是,返回,如 果是,执行 ADVANCE,在跳回到开始过程。 4、F 过程:开始,判断 SYM 是否不等于“A”或者 SYM 是否小于 Z,如果不是,执行 ADVACE, 然后执行返回,如果不是,再判断 SYM 是否不等于“(”,如果是,打印“ERROR”,TZ 赋 值 1,返回;如果不是,执行 ADVANCE,在执行 E 过程,接着继续判断 SYM 是否不等于“)”, 如果是,打印"ERROR",TZ 赋值 1,如果不是,执行 ADVANCE,返回。 5、SYM:取字符串 ST 的第一个字符给 SYM。 6、ADVANCE:取字符串 ST 去除首字符后留下的字符串。 本次试验主要是测试性试验,了解一下递归下降语法分析器的基本构成和结构等等。
递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一 个非终结符号。
每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号 时,调用该非终结符号对应的子程序来完成。
自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推 导
出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的 产
一、实验目的和要求 通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单
词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目 标:
1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的语法分析程序。 二、实验过程 (1)1、准备:阅读课本有关章节,确定算术表达式的文法。 2、考虑好设计方案。 3、设计出模块结构、测试数据,初步编制好程序。 (2)上机调试,发现错误,分析错误,在修改完善。、
编译原理实验报告
实验名称:_____递归下降语法分析器____ 实验类型:________验证型实验_________ 指导教师:_________何中胜_____________ 专业班级:________09计二______________ 姓 名:_________周健_______________ 学 号:______09030231_____________ 电子邮件:____________________________ 实验地点:_______院士楼720_____________ 实验成绩:____________________________
五、附录 # include "stdio.h" # include "string.h"
char sym; int tz =0; char st[50]; int ip=0; void myE(); void myT(); void myF(); void myAdvance(); void init(); void myE() {
相关文档
最新文档