Compiler construction 带LL(1)语法分析的歧义语法
我有很多问题要解决。我必须重写下面的语法,使其与LL(1)语法一起工作 → 名词|名词和名词| M,名词和名词 M→ M、 名词 我注意到的第一个问题是,语法在头为M的产品中是递归的,我这样修复它 M→ 名词NewPro 纽普→ , 名词NewPro 但后来我注意到,标题为S的产品模棱两可,但我不知道如何解决它,我试图“分解”这个名词,但实际上我不确定 你能帮我吗Compiler construction 带LL(1)语法分析的歧义语法,compiler-construction,grammar,ll,Compiler Construction,Grammar,Ll,我有很多问题要解决。我必须重写下面的语法,使其与LL(1)语法一起工作 → 名词|名词和名词| M,名词和名词 M→ M、 名词 我注意到的第一个问题是,语法在头为M的产品中是递归的,我这样修复它 M→ 名词NewPro 纽普→ , 名词NewPro 但后来我注意到,标题为S的产品模棱两可,但我不知道如何解决它,我试图“分解”这个名词,但实际上我不确定 你能帮我吗 谢谢你的回答 对M的左递归消除不完整——您忘记了规则NewPro→ ε 一旦添加了它,就剩下了S的问题,这不是含糊不清的,而是
谢谢你的回答 对
M
的左递归消除不完整——您忘记了规则NewPro→ ε
一旦添加了它,就剩下了S
的问题,这不是含糊不清的,而是需要左分解。自第一(M)项和子条款起;首先,您需要先将M替换为S:
→ 名词|名词和名词|名词NewPro、名词和名词
然后你们可以把这个因素简单地,放到
→ 名词S'是的→ ε|和名词| NewPro、名词和名词 现在的问题是,这个语法是LL(4),而不是LL(1),因为您需要4个token lookahead来查找
NewPro
s序列的结尾。这是一个更难处理的问题,但它是可以解决的。首先,您需要将,名词,
拉入NewPro:
是的→ ε|和名词| NewPro和名词纽普→ , 名词,|,名词NewPro 然后左因子NewPro: 纽普→ , 名词NewPro'
NewPro'→ , | 纽普 然后替换为NewPro': NewPro'→ , | , 名词NewPro' 左边的因素也是: NewPro'→ , NewPro“ NewPro“→ ε|名词NewPro' 给出最后的语法: → 名词S'
是的→ ε|和名词| NewPro和名词
纽普→ , 名词NewPro'
NewPro'→ , NewPro“”
NewPro“→ ε|名词NewPro' 它是LL(1),可以直接使用,也可以通过将NewPro替换回S'并重命名规则以去除'-后缀来简化: → 名词A
A.→ ε|和名词|,名词B和名词
B→ , C
C→ ε| noon B您的第一次重构是错误的-旧的M派生出
noon
,新的M没有。