是否存在没有LL(1)等效的LR(k)语法

时间:2015-07-17 22:48:39

标签: c parsing context-free-grammar ll lr

我还没能找到答案。是否存在无上下文且不含模糊且无法转换为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)

问题在于声明符和抽象声明符都有(在第一个集合中,但也是递归的。

1 个答案:

答案 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 -> , ...

FOLLOWparameter-list设置的一条注释将包含,个字符,这可能会导致FIRST-FOLLOW冲突。如果是这种情况,那么我们也需要看parameter-list定义来解决这个冲突。

编辑: parameter-declaration规则似乎很难立即回答。您可以尝试为所有有冲突的替代方案或使用某些辅助工具(例如ANTLR)手动执行左分解。