ANTLR4中的互左递归规则

ANTLR4中的互左递归规则,antlr4,Antlr4,我不明白ANTLR4如何能够使用直接let递归来帮助我们。 好的,你可以写一个语法来识别一种语言,好的。但你很少停在这里。通常,您希望对解析的树执行某些操作。为了得到一个直接的左递归,必须将多个规则折叠成一个规则,这在这里没有帮助 举个例子。假设我要定义+和-运算符,并希望它们具有相同的优先级。我会用黄金写下这样的话: expression : binaryExpression | unaryExpression ; binaryExpression : pl

我不明白ANTLR4如何能够使用直接let递归来帮助我们。 好的,你可以写一个语法来识别一种语言,好的。但你很少停在这里。通常,您希望对解析的树执行某些操作。为了得到一个直接的左递归,必须将多个规则折叠成一个规则,这在这里没有帮助

举个例子。假设我要定义+和-运算符,并希望它们具有相同的优先级。我会用黄金写下这样的话:

expression
    : binaryExpression
    | unaryExpression
    ;

binaryExpression 
    : plusExpression
    | minusExpression
    ;

plusExpression
    : expression '+' unaryExpression

minusExpression
    : expression '-' unaryExpression
expression
    : expression '+' unaryExpression # plusExpr
    | expression '-' unaryExpression # minusExpr
    | unaryExpression                # unaryExpr
    ;
在ANTLR4中,我当然能做到

expression
    : expression '+' unaryExpression
    | expression '-' unaryExpression
    | unaryExpression
    ;
但是,在生成的visitor中,我只有
expression
unaryExpression
的方法。当我访问
ExpressionContext
时,我怎么知道该做什么?这是加法还是子结构?

我找到了答案

可以这样“标记”备选方案:

expression
    : binaryExpression
    | unaryExpression
    ;

binaryExpression 
    : plusExpression
    | minusExpression
    ;

plusExpression
    : expression '+' unaryExpression

minusExpression
    : expression '-' unaryExpression
expression
    : expression '+' unaryExpression # plusExpr
    | expression '-' unaryExpression # minusExpr
    | unaryExpression                # unaryExpr
    ;
完成此操作后,您将发现在基本访问者中生成的相应方法