以下语法生成句子a, a
,a, b
,b, 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
,从而显着增加制作的数量?
答案 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 .
因此,我们没有“显着”增加制作数量。