我在Java中编写了一个解析器生成器,经过几次颠簸(例如早期版本并不特别喜欢左递归),我设法使它与一些简单的语法一起工作(所以我可以手工验证产品是否正确) 我试着给它提供一个更复杂的语法,输出结果是它不是一个LR(1)语法(来自解析后试图在解析表中的同一个单元格上写两次的事实)
有问题的语法是
S-> aAb的| SA
A-> AA |电子| S
我很确定这个语法是LR(1),无论如何,这是我程序的输出 http://pastebin.com/hJNC9uuN
任何建议都将是最宝贵的谢谢(如果有人有一个解析器生成器输出自动机和解析表以便我可以面对它们,那就更好了)
答案 0 :(得分:5)
这个语法不能成为LR(1),因为它不明确。以下是两种派生字符串ab
的方法:
S→aAb→ab
S→SA→aAbA→abA→ab
你的LR(1)套实际上包含一个转移/减少冲突。查看状态5,其中包括以下项目:
[A->S. { $a }]
[A->.aA { $a }]
这是一个转变/减少冲突:你转移a
,还是减少a
?因此,该工具在此输入上看起来正确:语法不是LR(1),并且它发现它不是LR(1)。
希望这有帮助!