递归下降分实验报告.docVIP

  • 15
  • 0
  • 约1.28万字
  • 约 22页
  • 2019-06-01 发布于浙江
  • 举报
PAGE PAGE 11 实习二 递归下降分析 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验预习提示 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 具体为: (1)对于每个非终结符号U-u1|u2|…|un处理的方法如下: U( ) { ch=当前符号; if(ch可能是u1字的开头) 处理u1的程序部分; else if(ch可能是u2字的开头)处理u2的程序部分; … else error() } (2)对于每个右部u1-x1x2…xn的处理架构如下: 处理x1的程序; 处理x2的程序; … 处理xn的程序; (3)如果右部为空,则不处理。 (4)对于右部中的每个符号xi ① 如果xi为终结符号: if(xi= = 当前的符号) { NextChar(); /% NextChar为前进一个字符函数。%/ return; } else 出错处理 ② 如果xi为非终结符号,直接调用相应的过程xi() 三、实验要求 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E-TG (2)G-+TG|-TG|ε (3)T-FS (4)S-*FS|/FS|ε (5)F-(E)|i 输出的格式如下: (1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (2)输出结果:i+i*i#为合法符号串 ? 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 3.学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 四、 实验内容 4.1 功能描述 这个程序是一个递归下降分析程序,能够判定输入的一个字符串是否属于给定的文法。如果不是,则会给出一定的出错信息,并且列出每一步使用的产生式。 4.2 全局变量及其定义 char a[50];//存储输入的字符串 char ch; //暂时存储输入的字符 char d[200];//记录当前堆栈中的产生式 int n1;//输入字符串的长度 char token;//当前待分析字符 4.3 模块设计 int E();//E过程,对应产生式E-TG int T();//T过程,对应产生式T-FS int G();//G过程,对应产生式G-+TG|-TG|ε int S();//S过程,对应产生式S-*FS|/FS|ε int F();//F过程,对应产生式F-(E)|i void output();//输出已分析字符串和当前字符 void input1();//输出剩余字符 4.4 程序流程图 YN Y N 开始 输出分析栈内容和当前动作 将分析栈的E换为TG TG return 1 return 0 结束 结束 输出分析信息 进行递归下降分析 得到第一个字符 将开始符放入堆栈 获取字符串长度 开始 输入要处理的字符串 图1 主函数main()流程图 图2 E函数()流程图 N N 结束 Y return 1 return 0 FS 将分析栈的T换为FS 开始 输出分析栈内容和当前动作 图3 T函数()流程图 图4 G函数()流程图 图5 F函数()流程图 图6 S函数()流程图 五、核心代码清单: 函数功能描述:根据文法E-TG,先从主函数开始调入第一个非终结符函数执行,并且显示调用产生式,根据程序的状态,调用非终结符函数T()或G(),进行递归向下分析。 int E() { int f,t; printf(E--TG\t); e[0]=E; e[1]==; e[2]=; e[3]=T; e[4]=G; e[5]=#; output(); flag=1; input(); input1

文档评论(0)

1亿VIP精品文档

相关文档