本资源为北京林业大学《编译原理》课程中实验二的内容,重点介绍并实现基于递归下降分析法的语法分析算法。包含相关理论知识及实践操作指导。
实验目的:通过阅读与改造PL/0编译程序来熟悉其整体架构,并识别各语法单位对应的子程序;掌握递归下降法的语法分析思想并加深理解。此外,设计、编写及调试YACC源程序以了解其基本结构。
实验内容:
1. 对PL/0编译器进行裁剪和改造,使其仅包含词法与语法规则解析过程。此修改后的程序需读入PL/0语言的源代码,并实现以下功能:(a)过滤掉形如/*...*/格式的注释;(b)在遇到词法或语法错误时输出相应的错误信息;(c)对于合法的算法表达式,包括标识符和常量,计算并显示其值。此外可选地扩展算术运算中对浮点数的支持。(d)若输入是一个有效的语法规则,则程序应输出“该规则正确,并未发现词法或语法错误”,同时展示对应的抽象语法树(建议使用缩进文本格式表示)。相关参考材料包括教材第四章第三版表4.3中的EBNF描述。PL/0编译器共有18个嵌套及并列的子函数,其中与语法规则直接相关的有block()、constdeclaration()、vardeclaration()、statement()、condition()、expression()、term()和factor()。
2. 使用LEX和YACC工具完成以下任务:阅读并运行给定程序(词法.l 和 语法.y),理解这两个工具的使用方法及它们之间的交互机制。通过修改这些源文件,使得最终生成的应用能够识别如下结构的语句:“I love you.”、“I like apples and pears.”等,并对不符合规则的语言输入输出“syntax error”。此外还可以自行定义符合英语文法的新句子。
程序执行示例:当用户键入cat eat mouse时,将返回Sentence is valid;而错误的语法如I love you.则会报错syntax error。