【问题标题】:LL(1) cannot be ambiguousLL(1) 不能模棱两可
【发布时间】:2010-04-17 08:40:49
【问题描述】:

如何证明任何 LL(1) 文法都不可能有歧义?

我知道什么是歧义语法,但无法证明上述定理/引理。

【问题讨论】:

  • 不可能有这样的证明,因为避免歧义是 LL(k) 语法定义的一部分。你不能证明一个定义。一个简单的例子是A:a|a。给定输入“a”,恰好有两个解析可以识别或接受“a”,因此该文法不是 LL(1),因为它是模棱两可的。请注意,A 有一个有效的 FIRST 集:{a}。

标签: compiler-construction grammar


【解决方案1】:

我认为这几乎是 LL(1) 定义的直接结果。尝试反证法;假设你有一个模棱两可的 LL(1) 语法,并寻找你可以证明是真的和不真的东西。作为起点,“您在处理输入时始终知道什么?”

由于这似乎是一个家庭作业问题,实际上我还没有完成比我上面概述的问题更多的问题,所以我会停在那里。

【讨论】:

  • 顺便说一句,我不确定这个猜想是否正确,但看起来确实合理。
【解决方案2】:

这是我在校样中的初稿。它可能需要一些微调,但我认为它涵盖了所有情况。我认为许多解决方案都是可能的。这是一个直接的证明。

(旁注:很遗憾 SO 不支持数学,例如在 LaTeX 中。)

证明

令 T 和 N 为终结符和非终结符的集合。

让以下保持

MaybeEmpty(s) = true <=> s ->* empty
First(s) = X containing all x for which there exists Y such that s ->* xY
Follow(A) = X containing all x for which there exists Y,Z such that S ->* YAxZ

请注意,如果以下对每对产生式 A -> B 和 A -> C 成立,则文法是 LL(1):

1. (not MaybeEmpty(B)) or (not MaybeEmpty(C))
2. (First(B) intersect First(C)) = empty
3. MaybeEmpty(C) => (First(B) intersect Follow(A)) = empty

考虑一种带有 is LL(1)、A -&gt; BA -&gt; C 的语言。 也就是说,有一些终结符串 TZ 允许不同的解析树进行多次推导。

假设左导达到S -&gt;* TAY -&gt;* TZ。下一步可能是TAY -&gt; TBYTAY -&gt; TCY。 因此,如果 BY -&gt;* ZCY -&gt;* Z 都存在,则该语言是模棱两可的。 (请注意,由于 A 是任意非终结符,如果不存在这种情况,则该语言是无歧义的。)

案例 1:Z = 空

根据 LL(1) 文法的规则 1,B 和 C 中最多有一个可以导出为空(非歧义的情况)。

案例2:Z非空,B和C都不为空

根据 LL(1) 语法的规则 2,B 和 C 中最多有一个可以允许进一步推导,因为 Z 的前导终结符不能同时出现在 First(B)First(C) 中(非歧义情况)。

案例 3:Z 非空,并且是 MaybeEmpty(B)MaybeEmpty(C)

注意 LL(1) 语法的 by 规则 1,B 和 C 不能都导出为空。因此假设MaybeEmpty(C) 为真。

这给出了两个子案例。

案例3a:CY -&gt; Y;以及案例 3b:CY -&gt;* DY,其中 D 不为空。

在 3a 中,我们必须在 BY -&gt;* ZCY -&gt; Y -&gt;* Z 之间进行选择,但请注意 First(Y) subset-of Follow(A)。由于Follow(A) 不与First(B) 相交,因此只能进行一次推导(非歧义)。

在 3b 中,我们必须在 BY -&gt;* ZCY -&gt;* DY -&gt;* Z 之间进行选择,但请注意 First(D) subset-of First(C)。由于First(C) 不与First(B) 相交,因此只能进行一个推导(非歧义)。

因此,在每种情况下,推导只能通过可用的产生式之一进行扩展。因此语法没有歧义。

【讨论】:

  • 你不能证明一个定义。请参阅我上面的评论。
  • @DavidSpector 有许多语法是明确的,但仍然不是 LL(k)。其中一些是包含 LL(k) 的 LR(k)。出于兴趣,您可能会惊讶地发现,排除歧义并没有出现在 LL(k) 语法的任何标准定义中,尽管这个想法通常是非正式地表达的。这可能令人惊讶的一个原因是人们经常学习 LL(k) 解析,这是预测性和确定性的。 LL(k) 语法从另一面看同样的东西。它们是生成的而不是预测的,并且在形式语法中没有确定性的概念。
  • 我没有关注你。你真的打算写你所做的吗?很容易写出像 A -> b 这样的语法; A -> b 看起来是 LL(1),因为它看起来有明确的 FIRST 集,但是因为它们重叠,所以语法是模棱两可的。这样的文法不是 LL(k),因为歧义使它们不是 LL(k);没有其他原因。
  • @DavidSpector 是的。让我们来看看你的例子。一个简单的解析器可能会处理 A -> b;一个-> b;作为两部作品。这个语法看起来模棱两可,但它不是,因为productions of a grammar are actually a set,所以重复统一。这个语法其实和A->b是一样的。回到 LL(k) 的定义,它没有提到歧义排除,因为尽管必要,但它还不够,并且可以从数学上推导出其他属性。这就是这里为 LL(1) 显示的内容。
  • 感谢您的指正,但我仍有疑问。歧义意味着某些输入有两种可能的解析(通过产品的路径)。虽然语法确实是使用集合来描述的,但两个相同的产生式由两个不同的集合表示,具有相同的内容。因此对于输入 b 有两个解析,一个选择第一个产生式,一个选择第二个产生式。我认为,LL(k) 语法理论并没有明确地提供一种将具有相同内容的产生式合并的方法。
【解决方案3】:

证明没有歧义文法可以是 LL(1) 文法。有关提示,请参阅http://www.cse.ohio-state.edu/~rountev/756/pdf/SyntaxAnalysis.pdf,幻灯片 18-20。另见http://seclab.cs.sunysb.edu/sekar/cse304/Parse.pdf,第 1 页。 11 及之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多