是否可以将此语法转换为LR(1)?

时间:2016-03-16 12:36:56

标签: parsing grammar context-free-grammar lr

以下语法生成句子a, aa, bb, b,...,h, b。不幸的是它不是LR(1)所以不能用于诸如“yacc”之类的工具。

S -> a comma a.
S -> C comma b.
C -> a | b | c | d | e | f | g | h.

是否可以将此语法转换为LR(1)(或甚至LALR(1),LL(k)或LL(1)),而无需扩展非终结C,从而显着增加制作的数量?

1 个答案:

答案 0 :(得分:2)

只要你的某些规则中的非逗号C前面的逗号不变,就不会这样了。

在这种情况下,很明显,解析器无法决定,看到“a”,并且具有前瞻性的“逗号”,无论是减少还是转移。因此,如果C没有改变,那么这个语法就不是LR(1),正如你所说的那样。

但解决方案在于两个短语,“看过'a'”和“C不变”。你问是否有没有扩展C的修复。没有,但你可以通过从C中删除“a”来扩展C“一点点”,因为这是问题的根源:

S -> a comma a .
S -> a comma b .
S -> C comma b .
C -> b | c | d | e | f | g | h .

因此,我们没有“显着”增加制作数量。