这个解析器生成器说这个语法不是 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)。
希望对您有所帮助!
我在 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)。
希望对您有所帮助!