LL(1),LR(0),SLR(1)文法分析器
-
软件介绍
该软件是一款集成的文法分析器,用户输入文法后能识别LL(1)文法,LR(0)文法和SLR(1)文法,并为用户提供分析表。
开发环境:Windows 10
开发工具:QT 5.9 -
界面介绍
-
使用方法
- 用户进入可执行程序文件夹,选择SyntaxAnalysis,点击运行软件。
- 用户开始输入文法:
2.1 用户每次输入一条产生式,分别输入左部和右部,其中左部只能是一个非终结符,右部可以是一个候选式,也可以是以“|”符号分开的部分或全部候选式。
2.2 用户每输入完成一次后,点击添加按钮,软件加入该产生式,用户可以在左边的窗口看见输入的产生式。
2.3 用户重复2.1、2.2步骤直到确认输入完成。 - 用户点击分析按钮,软件开始分析该文法,并给出相应的分析结果。
3.1 左边的窗口会给出这个文法是否为LL(1)文法,LR(0)文法和SLR(1)文法。
3.2 右边的窗口会给出这个文法的first集,follow集,select集。
3.3 如果分析成功,该软件会抛出对应文法的分析表。 - 用户可以点击重置按钮,继续输入新的文法然后分析。
-
使用说明(注意事项)
1.用户输入
1.1对于用户的输入和系统输出要说明的是,该系统规定了一部文法字典可以接收的一系列文法符号。具体如下:
非终结符:26个大写字母是用户可以输入的。不接受大写字母加一瞥,如:A’。
终结符:26个小写字母以及+、-、*、/、{、}、[、]、(、)、=、逗号、分号是用户可以输入的。
空串ε:以字符@代替。
候选式分隔符:|。
除了上述的符号,其余的输入占时是不接受的。
1.2 用户输入一个非终结符及开始符号时,无需考虑其候选式是否应该唯一,该软件将根据用户的输入决定是否自动拓展文法,拓展后的文法的开始符固定为S’。
2.分析表
2.1.LL(1)分析表中的内容表示使用哪一个产生式。
2.2.LR(0)分析表和SLR(0)分析表中行标题代表项目规范集的编号,也可以理解为DFA的状态编号。S和数字均代表跳转到相应状态,acc代表接受,项目代表使用该产生式进行规约,空白代表出错(注意:形如A->.的项目代表该产生式右部为空串ε的产生式)。
3.关于文法类型的说明
3.1.系统只能识别2型文法以上的文法,及左部只能式单一非终结符。
3.2.用户可以输入含左递归和含回溯的文法。
3.3.原则上该系统对每一种文法都要进行分析,但由于本人能力时间有限,对于含左递归(直接或间接)的文法,该系统只分析是否为LL(1)文法,并给出first集,follow集,select集,不再进行LR(0)文法和SLR(1)的分析。
4.其他
该软件仍然存在一些已知和未发现得缺陷与错误,欢迎用户提出与指正,本人将继续对这款软件进行改进。
*附:关于间接左递归文法的判断错误
对于课件中给出的文法:S->L=R|R
L->*R|i
R->L
其应该是没有左递归的,但由于算法问题被误判成了左递归
这是没有增加左递归判断的结果,根据与课件对比,这才是正确的。
这是增加了左递归判断后的结果,由于判断了左递归,故后续LR和SLR便没能判断,而且求出的first集与follow集也是错的。
最后给两个运行结果: