如何证明没有LL(1)语法可能含糊不清?
我知道什么是模棱两可的语法,但无法证明上述定理/引理。
答案 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 -> B
和A -> C
的语言。
也就是说,有一些终端字符串TZ允许不同的解析树进行多次派生。
假设左派生到达S ->* TAY ->* TZ
。下一步可能是TAY -> TBY
或TAY -> TCY
。
因此,如果BY ->* Z
和CY ->* 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 ->* Z
和CY -> Y ->* Z
之间进行选择,但请注意First(Y) subset-of Follow(A)
。由于Follow(A)
不与First(B)
相交,因此只能进行一次推导(非模糊)。
在3b中,我们必须在BY ->* Z
和CY ->* 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和之前。