2013-07-10 131 views
3

我不明白ANTLR4如何能够使用直接let-recursion实际上帮助我们。好吧,你可以写一个能识别语言的语法,没关系。但你很少停留在这里。通常你想用分析树做一些事情。为了得到一个直接的左递归而必须折叠一些规则在这里没有帮助。ANTLR4中的相互左递归规则

一个例子。假设我想定义+和 - 运算符并希望它们具有相同的优先级。黄金我会写这样的事:

expression 
    : binaryExpression 
    | unaryExpression 
    ; 

binaryExpression 
    : plusExpression 
    | minusExpression 
    ; 

plusExpression 
    : expression '+' unaryExpression 

minusExpression 
    : expression '-' unaryExpression 

当然在ANTLR4我可以做

expression 
    : expression '+' unaryExpression 
    | expression '-' unaryExpression 
    | unaryExpression 
    ; 

但当生成的访问者,我将只对expressionunaryExpression方法。当我访问ExpressionContext时,我该怎么知道该怎么办?它是一个附加或子系统吗?

回答

2

我找到了答案here

一个能“标签”的替代品是这样的:

expression 
    : expression '+' unaryExpression # plusExpr 
    | expression '-' unaryExpression # minusExpr 
    | unaryExpression    # unaryExpr 
    ; 

这样做之后,你会发现相应的基础访问者生成的方法。