这个解析器生成器说这个语法不是 LR(1) 但我有疑问

This parser generator says that this grammar isn't LR(1) but I have my doubts

我在 Java 中编写了一个解析器生成器,经过几次颠簸(例如,早期版本并不特别喜欢左递归),我设法让它使用一些简单的语法(所以我可以用手验证产品是否正确) 我尝试为它提供更复杂的语法,但输出结果是它不是 LR(1) 语法(源自已解析的语法试图在解析 table 中的同一单元格上写入两次)

有问题的语法是

S->aAb|SA
A->aA|e|S

我很确定这个语法是 LR(1),无论如何,这是我程序的输出 http://pastebin.com/hJNC9uuN

任何建议都将是最宝贵的谢谢(如果有人有一个解析器生成器可以输出自动机并解析 table 就更好了,这样我就可以面对他们了)

这个文法不能是 LR(1),因为它有歧义。这里有两种推导字符串ab的方法:

S → aAb → ab

S → SA → aAbA → abA → ab

您的 LR(1) 集实际上包含 shift/reduce 冲突。查看状态 5,其中包括以下项目:

[A->S. { $a }]
[A->.aA { $a }]

这是一个 shift/reduce 冲突:你是转向 a,还是减少 a?因此,该工具在此输入上看起来是正确的:语法不是 LR(1),并且发现它不是 LR(1)。

希望对您有所帮助!