我还没能找到答案。是否存在无上下文且不含模糊且无法转换为LL(1)的语法?
我找到了一个我无法弄清楚如何转换为LL(1)的作品:C99中的parameter-type-list
作品:
parameter-type-list:
parameter-list
parameter-list , ...
这是一个LR(k)语法的例子,它没有LL(1)等价物,或者我做错了什么?
编辑:我复制了错误的名字,我打算复制参数声明:
parameter-declaration:
declaration-specifiers declarator
declaration-specifiers abstract-declarator(opt)
问题在于声明符和抽象声明符都有(在第一个集合中,但也是递归的。
答案 0 :(得分:4)
通常,LR(k)
语法比LL(k)
更强大。这意味着有些语言包含LR(k)
解析器,但不是LL(k)
。
其中一个例子是用语法定义的语言:
S -> a S
S -> P
P -> a P b
P -> \epsilon
或者换句话说,a
' s的字符串,后跟相同或更少数量的b
' s。这是因为LL(k)
解析器必须对遇到的每个a
做出决定 - 是否与某些b
配对 - 向前看不超过k
个输入符号,但它们也可以是a
,但没有提供有用的信息。
要获得严格的证明,请在此处查看已接受答案的第二部分https://cs.stackexchange.com/questions/3350/is-this-language-ll1-parseable
然而,你的例子在LL(1)语法中只能是left factored
parameter-type-list -> parameter-list optional-ellipsis
optional-ellipsis -> \epsilon
optional-ellipsis -> , ...
FOLLOW
为parameter-list
设置的一条注释将包含,
个字符,这可能会导致FIRST-FOLLOW
冲突。如果是这种情况,那么我们也需要看parameter-list
定义来解决这个冲突。
编辑: parameter-declaration
规则似乎很难立即回答。您可以尝试为所有有冲突的替代方案或使用某些辅助工具(例如ANTLR)手动执行左分解。