我有问题要解决这个问题。我必须重写以下语法,使其适用于LL(1)解析
S→名词|名词和名词| M,名词和名词
M→M,名词|名词
我注意到的第一个问题是语法在带有标题M的制作中是递归的,我就像这样修复它
M→名词NewPro
NewPro→,名词NewPro
然而我注意到标题S的制作是模棱两可的,但我不知道如何修复它,我试图"分解"名词,但我不确定。
你能帮我吗?
感谢您的回答。
答案 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