编译原理辅助教学系统:LR0文法判断分析与句子分析
编译原理辅助教学系统:LR0文法判断分析与句子分析
一、实验目的
(1) 了解编译原理的基础框架。 (2) 学习编程设计相关知识并进行实践练习。 (3) 分析并设计LR0文法的判断分析和对应的句子分析的功能。
二、实验内容
(1) 理解LR0文法的判断分析和对应的句子分析模块的原理和其在编译程序中的作用。 (2) 开发设计编译原理辅助教学系统文法分析判别的框架及功能。 (3) 要求设计交互界面,能输入、能转换、能输出,形式和风格自定。
三、实验需求(需要实现哪些功能)
本次实验需要做的是编译原理辅助教学系统的LR0文法的判断分析和对应的句子分析模块,所以首先需要实现相应页面的基本框架,进行合适的布局,然后对每个组件编写功能,具体阐述如下:
(1) 判别LR0文法功能:在文本框中输入要判断的文法,也可以读入文件中的文法,然后点击确认文法按钮进行判断,能够弹出对话框显示是否为标准的正确的LR0文法。 (2) 读入文件功能:使用了对话框,利用字符串、数组等数据结构获取用户所要选择的文件的路径,并打开该文件,然后在文件的各显示框、标签中显示得到的数据内容。 (3) 保存文件功能:点击保存按钮,能够弹出对话框来让我们选择路径来保存文件,并在此路径下保存固定名称和格式的文件。 (4) 生成项目族信息功能:点击生成项目族信息按钮,即可在对应文本框中以状态和项目族信息两列数据信息的列表形式观察到各个项目族的具体信息及与编号的对应关系。 (5) 构造LR分析表功能:点击构造LR分析表按钮,即可在对应文本框中以行为非终结符和终结符,列为对应状态转换信息的列表形式观察到每个符号与对应状态序号(即执行顺序)所对应的转换信息。 (6) 句子分析功能:对文本框里的句子进行分析,判断句子是否为LR0文法,并将利用栈分析的结果以列表形式输出在文本框中,提供单步分析和一键分析两种方式。
四、主要数据结构介绍
首先系统中有很多控件,不同控件中运用的数据结构并不大相同。所以,控件中所用的控件结构首先展示如下:
表1 界面控件结构 控件 | 控件数据结构结构 ---|--- 界面 | Form 界面分隔框 | groupBox 文字显示 | label 按钮选项 | Button 文字输入框 | RichTextBox 数据显示框 | listView 文本框 | textBox
其次是程序中所用到的数据结构展示如下:
(1) 判别LR0文法功能:使用了String、List、int、bool、char等数据结构来表示和判断文法的产生式、项目族、分析信息等,并调用控件本身的Enabled来确保后续转换。 (2) 读入文件功能:使用了对话框类,利用字符串、数组等数据结构获取用户所要选择的文件的路径,并打开该文件利用数据流读取其内容存储在定义的变量中并显示。 (3) 保存文件功能:同样使用了对话框类,利用字符串、数组等数据结构获取用户所要选择的保存文件的路径,并在该路径下保存该文件。 (4) 生成项目族信息功能:使用了List、LRitemsets自定义类等数据结构存储的对应的信息,计算各状态编号对应的项目族情况,并储存在数据结构中,方便调用。 (5) 构造LR分析表功能:同样使用了String、List、Table、LRAna自定义结构等数据结构存储的对应的信息,计算各字符的状态转移情况,并储存在对应的预测分析表格table即二维数组中,方便调用。 (6) 句子分析功能:利用所定义的各类包含string、int、char、stack、list类型数据存储的对应的信息,然后使用各个定义不同信息的List结构存储输出内容。然后在显示在对应的文本框和标签中。
五、主要模块算法介绍
主要模块有八个,对应读入文件、保存文件、确认文法、生成项目族信息、构造LR分析表、分析句子六个功能,具体介绍如下: (1) 读入文件模块:
六、实验测试用例设计说明
实验中有很多对字符的判断分析,这些分析组又有很多的转换显示情况,对这些情况均需要处理,所以需要说明实验测试用例的设计相关内容。具体分析如下:
-
对文法输入测试用例设计 在对文法输入进行测试时,需要考虑以下情况: (1) 空输入:测试输入为空的情况,检查程序是否能够正确地处理空输入,并在界面上显示“输入文法为空”。 (2) 非终结符错误:测试输入左部为小写字符的非终结符的情况,检查程序是否能够正确地判断输入的产生式是否规范,并在界面上显示“产生式输入不规范”。 (3) 推导符号错误:测试输入产生式的推导符号错误的情况,检查程序是否能够正确地判断输入的产生式是否规范,并在界面上显示“产生式输入不规范”。 (4) LR0文法规则错误:测试输入的文法不满足LR0文法规则的情况,检查程序是否能够正确地判断输入的文法是否符合规则,并在界面上显示“不是LR0文法”。 (4) 正确的输入:测试输入规范且符合LR0文法规则的情况,检查程序是否能够正确地处理输入,并在界面上显示正确的文法。
-
句子分析测试用例设计 在对句子分析进行测试时,需要考虑以下情况: (1) 合法句子:测试输入的句子符合LR0文法规则且能够推导出对应文法的合法句子的情况,检查程序是否能够正确地进行句子分析,并在对应的显示区域下输出推导分析过程。 (2) 非法句子:测试输入的句子不符合LR0文法规则或不能推导出对应文法的合法句子的情况,检查程序是否能够正确地判断句子是否合法,并在对应的显示区域下输出“失败”字样。
-
异常情况测试用例设计 在对异常情况进行测试时,需要考虑以下情况: (1) 输入文法为空:测试输入文法为空的情况,检查程序是否能够正确地处理空输入,并在界面上显示“输入文法为空”。 (2) 输入的句子不符合LR0文法规则:测试输入的句子不符合LR0文法规则的情况,检查程序是否能够正确地判断句子是否合法,并在对应的显示区域下输出“失败”字样。 (3) 程序崩溃:测试程序在运行过程中出现崩溃的情况,检查程序是否能够正确地处理异常情况,并在界面上显示错误信息。 (4) 界面显示错误:测试界面显示错误的情况,检查程序是否能够正确地显示信息,并在界面上显示错误信息。 (5) 性能测试:测试程序的性能,包括程序的响应速度、内存占用情况等。
七、实验结果测试情况(以截图形式)
运行程序,逐个点击打开文件+确认文法或者直接输入文法、生成项目族信息、构造LR分析表、输入待分析句子、分析、单步显示或一键显示按钮后,可以对所给文法及句子进行分析,并显示在各文本框中,同时可提分析结果的文本的保存。图示如下:
[图片展示]
图示样例中,包含对文法和句子读入和分析,结果都显示在程序的设计页面中了。各个阶段的数据的显示也更利于我们对这整个过程的学习和理解,更方便分析和验证。
八、实验结果自我评价
本次实验中,我们成功地开发了一个编译原理辅助教学系统,实现了LR0文法的判断分析和对应的句子分析模块。在实验过程中,我们深入学习了编译原理的基础框架,掌握了编程设计相关知识并进行了实践练习。
在实验中,我们首先进行了界面的设计和布局,然后对每个组件进行了功能编写。其中,判别LR0文法、读入文件、保存文件、生成项目族信息、构造LR分析表、分析句子六个功能是实验的重点,我们针对每个功能分别进行了测试用例的设计,并进行了测试验证。
在测试中,我们考虑了各种情况,包括输入为空、输入不规范、文法不符合LR0文法规则、句子不合法、程序崩溃、界面显示错误等异常情况,以及程序的性能测试。通过测试,我们发现程序能够正确地处理各种情况,并且在界面上显示了正确的结果。
总体而言,我们对本次实验的结果感到满意。我们成功地开发了一个实用性较强的编译原理辅助教学系统,实现了LR0文法的判断分析和对应的句子分析模块,同时也深入学习了编译原理的相关知识。在实验过程中,我们遇到了一些困难和问题,但通过不断学习和探索,最终成功地解决了这些问题。我们相信,通过这次实验,我们不仅提高了自己的编程能力,也对编译原理有了更深入的理解和认识。
但是,我们也意识到,本次实验还有一些不足之处。例如,在界面设计方面,我们的设计可能还有些简陋,需要进一步完善和优化;在代码编写方面,可能还有一些冗余代码和不必要的重复操作,需要进一步优化和改进。此外,我们也认为,实验中还可以加入更多的功能和模块,以满足更多的需求和应用场景。
因此,我们将继续努力,不断完善和优化编译原理辅助教学系统,提高其实用性和可靠性,同时也不断学习和探索编译原理的相关知识,为将来的学习和工作打下更坚实的基础。
原文地址: http://www.cveoy.top/t/topic/fZVJ 著作权归作者所有。请勿转载和采集!