是否可以将此文法转换为 LR(1)?
Is it possible to transform this grammar to be LR(1)?
以下语法生成句子 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
从而显着增加制作数量?
只要在某些规则中逗号前的非终结符 C 不变,就不会。
在那种情况下,很明显解析器无法决定,已经看到 "a",并且有前瞻性 "comma",是减少还是移动。所以在 C 不变的情况下,这个语法不是 LR(1),就像你说的那样。
但解决方案就在于"having seen an 'a'" 和"C unchanged" 这两个短语。您询问是否有不扩展 C 的修复程序。没有,但您可以通过从 C 中删除 "a" 来扩展 C "a little bit",因为这是问题的根源:
S -> a comma a .
S -> a comma b .
S -> C comma b .
C -> b | c | d | e | f | g | h .
因此,我们没有"significantly"增加制作数量。
以下语法生成句子 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
从而显着增加制作数量?
只要在某些规则中逗号前的非终结符 C 不变,就不会。
在那种情况下,很明显解析器无法决定,已经看到 "a",并且有前瞻性 "comma",是减少还是移动。所以在 C 不变的情况下,这个语法不是 LR(1),就像你说的那样。
但解决方案就在于"having seen an 'a'" 和"C unchanged" 这两个短语。您询问是否有不扩展 C 的修复程序。没有,但您可以通过从 C 中删除 "a" 来扩展 C "a little bit",因为这是问题的根源:
S -> a comma a .
S -> a comma b .
S -> C comma b .
C -> b | c | d | e | f | g | h .
因此,我们没有"significantly"增加制作数量。