我最近一直在玩很多不是LL(1)的语法,其中很多都可以转换成LL(1)的语法。
但是,我从未见过不是LL(1)的明确语言的例子。换句话说,这种语言的任何明确语法都不是LL(1)的语言,也不知道如果我不小心偶然发现了一个语言,我将如何证明我找到了一个语言。
有谁知道如何证明特定的明确语言不是LL(1)?
答案 0 :(得分:4)
我一直在思考这个问题,然后在Wikipedia找到了这种语言:
S -> A | B
A -> 'a' A 'b' | ε
B -> 'a' B 'b' 'b' | ε
他们声称上述语法描述的语言不能用LL(k)语法描述。你只询问了LL(1),这非常简单。只有第一个符号,你不知道序列是'ab'还是'aab'(或者更多是递归的),因此你不能选择正确的规则。所以语言肯定不是LL(1)。
此语法生成的每个序列也只有一个派生树。所以语言是明确的。
你问题的第二部分有点困难。证明语言是LL(1)要比相反(没有描述语言的LL(1)语法)容易得多。我想你只是创建一个描述语言的语法,然后你试着把它变成LL(1)。在发现无法解决的冲突后,您必须以某种方式利用它并创建证据。