"这篇实验报告来自北华航天工业学院计算机科学与工程系的一名学生,路玉华,他在2011年3月31日完成了《编译原理》课程的实验,指导教师是李建义。实验内容是用递归下降子程序实现对算术表达式的语法分析,以判断其结构是否正确。实验基于以下文法:E → TE',E' → +TE' | ε,T → FT',T' → *FT' | ε,F → (E) | i。"
在编译原理中,递归下降子程序是一种实现自顶向下语法分析的方法。这种方法利用函数的递归调用来模拟上下文无关文法的规则,每个非终结符对应一个函数,而文法规则的右部则转化为函数的调用序列。在本实验中,学生被要求为给定的算术表达式文法编写递归下降解析程序。
实验的主要目标是理解递归下降预测分析的工作原理,包括如何处理回溯问题,以及分析这种解析方法的优缺点。为了完成实验,学生需要预习自上而下语法分析的相关知识,并选择合适的开发环境,如VC++,来编写和测试代码。
实验的具体实现包括以下几个关键的递归子程序:
1. `E()` 函数用于解析表达式E,首先调用 `T()` 函数处理一个基本的术语,然后调用 `E1()` 处理可能的加法操作。
2. `E1()` 函数检查当前字符是否为 '+',如果是,则调用 `nexttoken()` 获取下一个字符,并再次调用 `T()` 和 `E1()` 处理后续的加法项。如果当前字符不是 '+',则表示没有更多的加法项,分析结束。
3. `T()` 函数处理术语T,先调用 `F()` 处理因子,然后调用 `T1()` 处理可能的乘法操作。
4. `T1()` 函数检查当前字符是否为 '*',如果是,则调用 `nexttoken()` 获取下一个字符,再次调用 `F()` 和 `T1()` 处理乘法项。若当前字符不是 '*',则表示没有更多的乘法项,分析结束。
5. `F()` 函数处理因子F,它能够处理括号包围的表达式(通过调用 `E()`)或直接的变量i。
`nexttoken()` 函数用于读取输入的下一个字符,`error()` 函数在检测到语法错误时触发,输出错误信息并结束分析。
通过这样的递归下降子程序设计,实验能够识别并分析由词法分析器输出的记号形式的算术表达式,例如 "i+i*i" 或 "i*i+i",并给出结构正确或错误的分析结果。实验结果部分未在提供的内容中完整展示,但通常会包括程序的运行示例和对实验过程的总结。