这是我在校样中的初稿。它可能需要一些微调,但我认为它涵盖了所有情况。我认为许多解决方案都是可能的。这是一个直接的证明。
(旁注:很遗憾 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 -> 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) 语法的 by 规则 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) 相交,因此只能进行一个推导(非歧义)。
因此,在每种情况下,推导只能通过可用的产生式之一进行扩展。因此语法没有歧义。