"鲍吴迪_lab51编译原理与设计实验报告:C语法子集语法分析及错误处理"

需积分: 0 0 下载量 149 浏览量 更新于2023-12-16 收藏 2.34MB DOCX 举报
实验目的:通过本实验,我熟悉了C语言的语法规则并了解了编译器语法分析器的主要功能。我还学习了典型的语法分析器构造技术和方法,设计并实现了具有一定复杂性和分析能力的C语言语法分析器。此外,我还学习了ANTLR工具的工作原理和基本思想,学会了使用该工具自动生成语法分析器。最后,我还掌握了编译器从前端到后端各个模块的工作原理,了解了语法分析模块与其他模块之间的交互过程。 实验内容:本实验选择了C语言的一个子集,基于BIT-MiniCC构建了C语法子集的语法分析器。该语法分析器能够读取词法分析器输出的存储在文件中的属性字符流,并进行语法分析和错误处理。对于输入正确的情况,它能够输出JSON格式的语法树;对于输入错误的情况,它能够报告语法错误。 实验过程:本实验基于BIT-MINICC中的ExampleParser,对以下语句进行了语法分析的实现:语句块、混合语句、表达式语句和if-else选择语句。 在开始实验的时候,我将声明语句的识别部分放在了语句识别函数stmt()中,判断当前识别的字符是否为int。然而后来发现,ASTDeclaration并不继承ASTStatement,因此这种设计是错误的。为了解决这个问题,我将声明语句识别的逻辑提取出来,并放到了单独的函数中。 接下来,我使用ANTLR工具来生成词法分析器和语法分析器。首先,我编写了语法规则文件,描述了C语言子集的语法规则。然后,我使用ANTLR工具来生成词法分析器和语法分析器的代码。 接下来,我根据生成的词法分析器和语法分析器代码,实现了语法分析器的主要功能。在语法分析的过程中,我按照从顶层到底层的顺序逐步解析语法树节点,通过递归下降的方法来遍历语法规则,进行语法分析。对于每一个语法规则,我都编写了相应的处理函数。 在实现过程中,我还实现了错误处理的机制。当遇到语法错误时,我会输出错误信息,并尝试从错误中恢复,继续进行语法分析,以尽可能提取出更多的错误信息。 最后,我编写了测试用例来验证语法分析器的正确性。我分别测试了语句块、混合语句、表达式语句和if-else选择语句的语法分析功能。在每个测试用例中,我模拟输入属性字符流,然后运行语法分析器进行分析,并检查输出是否符合语法规则。 通过本实验,我成功地实现了C语言语法子集的语法分析器,并且能够正确解析语法并报告错误。我熟悉了C语言的语法规则,了解了编译器语法分析器的主要功能,掌握了经典的语法分析器构造技术和方法,并学会了使用ANTLR工具自动生成语法分析器。此外,通过与其他模块的交互过程,我对编译器从前端到后端各个模块的工作原理也有了更深入的了解。