M 的左递归消除是不完整的——你忘记了规则 NewPro → ε
添加后,您就会遇到S 的问题,这不是模棱两可的,但需要左因式分解。自 FIRST(M) ⊆ FIRST(S),你需要先将 M 代入 S:
S → 名词 |名词和名词|名词 NewPro、名词和名词
然后您可以简单地将其左分解为
S → 名词 S'
S' → ε |和名词 | NewPro、名词和名词
现在你遇到了这个语法是 LL(4) 而不是 LL(1) 的问题,因为你需要 4 个标记前瞻才能找到 NewPros 序列的结尾。这是一个更难处理的问题,但可以解决。首先您需要将, noun, 拉入NewPro:
S' → ε |和名词 | NewPro 和名词
NewPro → , 名词, | , 名词 NewPro
然后是左因子 NewPro:
NewPro → , 名词 NewPro'
新Pro' → , |新人
然后代入NewPro':
NewPro' → , | , 名词 NewPro'
还有左因素:
NewPro' → , NewPro''
NewPro'' → ε |名词 NewPro'
给出最终的语法:
S → 名词 S'
S' → ε |和名词 | NewPro 和名词
NewPro → , 名词 NewPro'
NewPro' → , NewPro''
NewPro'' → ε |名词 NewPro'
这是 LL(1),可以直接使用,也可以通过将 NewPro 替换回 S' 并重命名规则以去除 '-suffixes 来稍微简化一下:
S → 名词 A
A → ε |和名词 | , 名词 B 和名词
B → , C
C → ε |名词 B