【问题标题】:Ambiguous grammar with LL(1) parse带有 LL(1) 解析的歧义文法
【发布时间】:2014-10-26 18:20:22
【问题描述】:

我在解决这个问题时遇到了问题。我必须重写以下语法以使其适用于 LL(1) 解析

S → 名词 |名词和名词| M、名词和名词

M → M, 名词 |名词

我注意到的第一个问题是语法在带有头 M 的生产中是递归的,我像这样修复它

M → 名词 NewPro

NewPro → , 名词 NewPro

但后来我注意到带有标题 S 的产生式是模棱两可的,但我不知道如何解决它,我试图“分解”名词但我实际上不确定。

你能帮帮我吗?

感谢您的回答。

【问题讨论】:

  • 你的第一次重构是错误的——旧的 M 派生 noun,新的 M 没有。

标签: compiler-construction grammar ll


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2012-10-19
    相关资源
    最近更新 更多