《编译原理》实验报告主要关注的是递归下降分析法,这是一种在编译器设计中用于解析输入语法的重要技术。该方法基于自上而下的分析策略,从文法的起始符号开始,通过递归调用一系列子程序来解析输入的算术表达式。
实验的目标包括三个方面:
1. 理解并掌握自上而下语法分析的基本要求和特性。自上而下分析是从文法的起始符号开始,尝试匹配输入串,遵循文法规则的结构。
2. 学习并应用递归下降语法分析。这种方法对应于每个非终结符创建一个递归函数,这些函数根据文法规则的右部进行操作,遇到终结符时进行匹配,遇到非终结符时调用相应的函数。
3. 学习相关数据结构的设计。在递归下降分析中,通常需要构建栈或其他数据结构来辅助解析过程。
实验内容是编写一个递归下降分析器来处理特定的算术表达式文法,其规则如下:
- E → E + T | T
- T → T * F | F
- F → ( E ) | i
在设计分析中,使用了递归下降方法进行词法分析。程序中包含一个数组`s`存储输入字符串,以及一个`read()`函数用于读取待匹配字符。通过遍历文法规则的右部,逐个匹配字符或调用对应的函数。当遇到终结符时进行匹配,不匹配则终止;遇到非终结符时,调用相应的函数,如`E_function()`, `EE_function()`, `T_function()`, `TT_function()`, 和 `F_function()`。这些函数分别对应文法中的非终结符,并按照文法规则的结构进行递归调用。在分析过程中,如果遇到标识符'#',表示分析成功,程序结束。
源代码中,每个函数都对应文法规则的一个分支,并使用`goto`语句来实现递归和重复匹配。例如,`EE_function`和`TT_function`使用循环结构(通过标签和`goto`)来处理加法和乘法的连续出现。在主函数`main()`中,用户输入的字符串会被附加一个'#'作为结束标志,然后调用分析函数开始解析。
总结来说,这个实验旨在通过实践加深对递归下降分析法的理解,以及如何将其应用于实际的算术表达式解析。通过这样的练习,学生可以学习到如何构建解析器,处理输入字符串,并根据文法进行有效的语法分析。这种技能对于理解和构建编译器至关重要。