左递归ANTLR语法

左递归ANTLR语法,antlr,antlr3,antlrworks,left-recursion,Antlr,Antlr3,Antlrworks,Left Recursion,我写了一个语法,但是得到了一个左递归错误 grammar Lang; options { output = AST; language = C; ASTLabelType= pANTLR3_BASE_TREE; backtrack = true; } start : primary_expression+ ; primary_expression : '{' expression '}'

我写了一个语法,但是得到了一个左递归错误

grammar Lang;

options
{
    output  = AST;
    language    = C;
    ASTLabelType= pANTLR3_BASE_TREE;
    backtrack   = true;
}

start   : primary_expression+
    ;

primary_expression
                : '{' expression '}'
                | expression ',' expression
                ;

expression
                : logical_or_expression
                | logical_or_expression '?' expression ':' expression
                | logical_or_expression '?' ':' expression
                | logical_or_expression '?' expression
                ;

logical_or_expression
                : logical_and_expression
                | logical_and_expression '|' logical_or_expression
                ;

logical_and_expression
                : primary_expression
                | primary_expression '&' logical_and_expression
                ;
我得到以下错误:

[12:41:35]错误(210):以下规则集是相互左递归的[primary_expression,logical_and_expression,logical_or_expression,expression]
[12:41:35]正在中止,因为以下规则是相互保留的递归规则: [[Lang.primary_表达式,索引=2,行=19],[Lang.logical_和_表达式,索引=5,行=36],[Lang.logical_或_表达式,索引=4,行=31],[Lang.expression,索引=3,行=24]]


修正语法
Antlr 4可以处理直接左递归,但不能处理间接左递归。在第一种情况下,“primary_expression”和“logical_and_expression:primary_expression…”形成了间接左递归。但现在antlr4无法生成“c”代码

grammar test3;

options
{
    language    = Java;
}

start   : 
    expression+
    ;

expression : 
    primary_expression
    | expression '&' expression
    | expression '|' expression
    | expression '?' expression ':' expression
    | expression '?' expression 
    | expression '?' ':' expression 
    | expression ',' expression
    | '{' expression '}'
    ;

primary_expression : // variable or constant definition, such as
    VARIABLE 
    | NUMBER
    ;
VARIABLE :
    ('A'..'Z')+
    ;

NUMBER :
    ('0'..'9') +
    ;

我使用的是antlrworks-1.4.3.jar.v4,错误仍然是一样的:C:\Users\agupta\Desktop>java-cp antlr-4.0-complete.jar org.antlr.v4.Tool Lang4.g错误(119):Lang4.g:::以下规则集是相互左递归的[primary_expression,logical_and_expression,expression,logical_or_expression],正如我所说的,我是语法新手,所以这一定是个错误。你能建议我如何纠正这个问题吗。我只需要一个语法来处理以下=>,“{”}?”:“|”和“谢谢你的提示:)。我已经通过添加终端和生成代码来更正语法。
grammar test3;

options
{
    language    = Java;
}

start   : 
    expression+
    ;

expression : 
    primary_expression
    | expression '&' expression
    | expression '|' expression
    | expression '?' expression ':' expression
    | expression '?' expression 
    | expression '?' ':' expression 
    | expression ',' expression
    | '{' expression '}'
    ;

primary_expression : // variable or constant definition, such as
    VARIABLE 
    | NUMBER
    ;
VARIABLE :
    ('A'..'Z')+
    ;

NUMBER :
    ('0'..'9') +
    ;