一、实验目的
通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证。通过对基于LL(1)文法的预测分析表法模拟程序实验,使学生掌握确定的自上而下的语法分析的实现技术,及具体实现方法。通过本实验加深对语词法分析程序的功能及实现方法的理解 。
二、实验环境
供Windows系统的PC机,可用C++/C#/Java/python等编程工具编写
三、实验内容
1、自己定义一个LL(1)文法
示例如(仅供参考) G[E]:
E →TE'
E' → +TE' | ε
T →FT'
T' → *FT' | ε
F → i | ( E )
2、构造其预测分析表,如
image.png3、LL(1)文法的预测分析表的模型示意图
4、预测分析控制程序的算法流程
5、运行结果,示例如下
四、实验方式与要求
概要设计(总体设计思想)
我采用了JavaScript语言作为主体代码逻辑支持,然后用HTML显示输入控件,让用户可以自定义测试自己的输入字符串是否可以被接受。
在线预览:基于LL(1)文法的预测分析表法
源码地址:https://github.com/navelorange1999/compilation_principle/blob/master/LL(1).html
详细设计(程序主流程、存储格式、关键函数的流程图、核心代码)
1. 程序主流程
2. 存储格式
3. 关键函数的流程图
l 根据预测分析表,判断输入串是否被该文法接受
4. 核心代码
l 初始预测分析表:
l 根据预测分析表,判断输入串是否被该文法接受
结果分析(输入与输出结果)
总结(设计亮点+实验体会)。
主要是依赖于HTML与JS的可视化便捷程度,来达到一种直观的构建并识别的效果,同时采用了JS中的Map数据类型,将预测分析表的一行当作一个整体,进而方便得出产生式右部然后再入栈进行下一步递归,直到符合出口条件,否则抛出异常。本次实验并没有让用户自定义文法,而是程序中直接初始化了预测分析表,所以代码量就没有实验一那么多,但还是能够直观地体会LL(1)文法的分析过程,对其也有了更深入的了解。
网友评论