LL(1)解析的歧义语法

时间:2014-10-26 18:20:23

标签: compiler-construction grammar ll

我有问题要解决这个问题。我必须重写以下语法,使其适用于LL(1)解析

S→名词|名词和名词| M,名词和名词

M→M,名词|名词

我注意到的第一个问题是语法在带有标题M的制作中是递归的,我就像这样修复它

M→名词NewPro

NewPro→,名词NewPro

然而我注意到标题S的制作是模棱两可的,但我不知道如何修复它,我试图"分解"名词,但我不确定。

你能帮我吗?

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

M的左递归消除不完整 - 你忘记了规则NewPro→ε

一旦你添加了它,你就会遇到S的问题,这个问题不含糊,但需要保留因子。由于FIRST(M)⊆FIRST(S),您需要先将M替换为S:

S→名词|名词和名词|名词NewPro,名词和名词

然后你可以简单地将左因素转换为

S→名词S' S'→ε|和名词| NewPro,名词和名词

现在你遇到的问题是这个语法是LL(4)但不是LL(1),因为你需要4个令牌前瞻来找到NewPro s序列的结尾。这是一个难以处理的问题,但它可以修复。首先,您需要将, noun,拉入NewPro:

S'→ε|和名词| NewPro和名词
NewPro→,名词,| ,名词NewPro

然后是左因素NewPro:

NewPro→,名词NewPro'
NewPro'→,|展示新品推荐网上

然后替换为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