由于递归规则调用,规则具有非LL(*)决策

时间:2013-06-07 13:37:12

标签: antlr grammar xtext

我有一个错误(如标题中所述)有一条规则,我不知道如何解决。

我写了以下规则:

FunctionArguments returns FunctionArgs::IFunctionArguments :
    FunctionArgumentsNormal
    | FunctionArgumentsForIter
    ;

FunctionArgumentsNormal returns FunctionArgs::IFunctionArguments :
    {FunctionArgs::FunctionArguments} args+=Expression (',' args+=Expression)* 
    | {FunctionArgs::FunctionArguments} argNames+=NamedArguments (',' argNames+=NamedArguments)*
    ;

FunctionArgumentsForIter returns FunctionArgs::IFunctionArguments :
    {FunctionArgs::FunctionArgumentsIterator} exp=Expression 'for' iterators=ForIterator
    ;

你能帮我解决一下这个表达式吗或者给别人解决方案吗?

1 个答案:

答案 0 :(得分:0)

在LL语法中,您可以没有左递归。问题是LL解析器可以选择这样的派生: FunctionArguments - > FunctionArgumentsNormal - > FunctionArguments - > FunctionArgumentsNormal ... 你的语法包含所谓的间接左递归。您可以在此维基百科文章中找到一个示例,其中还包含有关如何解决此问题的解决方案:Left-Recursion。 一个好的起点是(我想你已经这样做了)以一种非常简单的方式编写你的语法,而你的例子中没有包含所有的注释和内容。如果您在简单表格上有语法:

S -> A | B
B -> "terminal1" B
  |  b
A -> a "terminal2"

进行必要的重写要容易得多。