LL(1)不能含糊不清

时间:2010-04-17 08:40:50

标签: compiler-construction grammar

如何证明没有LL(1)语法可能含糊不清?

我知道什么是模棱两可的语法,但无法证明上述定理/引理。

3 个答案:

答案 0 :(得分:7)

我认为这几乎是LL(1)定义的直接结果。尝试通过矛盾证明;假设你有一个含糊不清的LL(1)语法,并寻找你可以证明是真实而不是真实的东西。作为一个起点“你在处理输入时总是知道什么?”

因为这看起来像是一个家庭作业问题而且我实际上还没有完成问题,而不是我在上面勾勒出来的,我会停在那里。

答案 1 :(得分:5)

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

(旁注:遗憾的是,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 - >,则语法为LL(1)。 B和A - &gt; C:

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

考虑使用LL(1),A -> BA -> C的语言。 也就是说,有一些终端字符串TZ允许不同的解析树进行多次派生。

假设左派生到达S ->* TAY ->* TZ。下一步可能是TAY -> TBYTAY -> TCY。 因此,如果BY ->* ZCY ->* 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)语法的规则1,B和C不能都导出空。因此假设MaybeEmpty(C)为真。

这给出了两个子案例。

案例3a:CY -> Y;和案例3b:CY ->* DY,其中D不为空。

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

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

因此,在每种情况下,推导只能通过可用产品之一进行扩展。因此语法不含糊。

答案 2 :(得分:1)

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