一、实验目的
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。
二、实验内容
程序输入/输出示例(以下仅供参考):
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(1)E- TG
(2)G- +TG|—TG
(3)G- ε
(4)T- FS
(5)S- *FS|/FS
(6)S- ε
(7)F- (E)
(8)F- i
输出的格式如下:
(1) 递归下降分析程序,编制人:姓名,学号,班级
(2) 输入一个以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#
(3) 输出结果:i+i*i#为合法符号串
备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。
注意:
1. 表达式中允许使用运算符(±*/)、分割符(括号)、字符I,结束符#;
2. 如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)。
三、实验方法
- 实验方法:采用Java程序语言进行设计,有控制台根据提示语句进行输入
- 实验原理:递归下降分析法
- 实验工具:IntelliJ IDEA
#四、实验步骤 - 对递归下降分析算法进行详细分析;
- 优化文法(合并化简,消除左递归),作为程序执行的文法进行输入
- 编写程序,采用递归方法调用函数,getchar方法获取下一个字符,index作为当前字符下标进行参考判断。
五、实验结果
- 实验输入:
请输入测试次数:3
请输入一个以#结束的符号串:
i+i*i#
请输入一个以#结束的符号串:
i+i/i#
请输入一个以#结束的符号串:
i+i*#
- 输出结果:
六、实验结论
本实验利用自定义的源程序对递归下降分析法进行了实现和测试,结果符合预期的结果
测试源码如下:
import java.util.Scanner;
public class Recursive {
static String str = ""; //待测试语句
static int index = 0; //记录当前读到的序号
/**
* 定义下列文法
* (1)E->iSGE1
* (2)E1->SGE1|ε
* (3)G->+TG|—TG|ε
* (4)S->*FS|/FS|ε
* (5)F->(E)|i
*/
public static void main