Antlr4 以下规则集是相互左递归的

Antlr4 以下规则集是相互左递归的,antlr4,Antlr4,我正在使用ANTLR4,但出现以下错误: 以下规则集是相互左递归的[primary\u expression,primary\u no\u array\u creation\u expression] 下面是导致该错误的语法片段: primary_expression : primary_no_array_creation_expression | array_creation_expression ; primary_no_array_creation_exp

我正在使用ANTLR4,但出现以下错误:

以下规则集是相互左递归的[primary\u expression,primary\u no\u array\u creation\u expression]

下面是导致该错误的语法片段:

primary_expression
    :   primary_no_array_creation_expression
    |   array_creation_expression
    ;

primary_no_array_creation_expression
    :   literal
    |   simple_name
    |   parenthesized_expression
    |   member_access
    |   primary_expression '.' identifier type_argument_list?
    |   primary_expression '(' argument_list? ')'
    |   primary_no_array_creation_expression '[' argument_list ']'
    |   this_access
    |   base_access
    |   primary_expression '++'
    |   primary_expression '--'
    |   object_creation_expression
    |   delegate_creation_expression
    |   anonymous_object_creation_expression
    |   typeof_expression
    |   checked_expression
    |   unchecked_expression
    |   default_value_expression
    |   anonymous_method_expression
    |   primary_expression '->' identifier
    |   primary_no_array_creation_expression '[' expression ']'
    |   sizeof_expression
    ;

在示例语法中,
primary\u expression
可以是
primary\u no\u array\u creation\u expression

然后,
primary\u no\u array\u creation\u expression
可以是
primary\u expression++

因此,
primary\u no\u array\u creation\u expression
也可以是
primary\u no\u array\u creation\u expression++

例如,当对其他规则存在“单向”依赖关系时,这是允许的

term   : Digit
       | term Operator term
       ;

product : term Operator term ;
这将是有效的,因为即使一个术语是自引用的(左递归),它在自己的定义中也是如此

以下内容无效:

term   : Digit
       | term Operator term
       | product Operator product
       ;

product : term Operator term ;
这里,
产品
引用一个
术语
,反之亦然,因此创建了一个相互向左的递归模式


你应该把你的语法分成不同的规则。

我遇到了同样的问题,这里将详细讨论: