3

我不明白 ANTLR4 能够使用直接 let-recursion 对我们有何帮助。好的,您可以编写一个可以识别语言的语法,好吧。但你很少停在这里。通常你想对解析树做一些事情。并且为了获得直接的左递归而不得不将多个规则合二为一并没有帮助。

一个例子。假设我想定义 + 和 - 运算符并希望它们具有相同的优先级。在 GOLD 中,我会写这样的东西:

expression
    : binaryExpression
    | unaryExpression
    ;

binaryExpression 
    : plusExpression
    | minusExpression
    ;

plusExpression
    : expression '+' unaryExpression

minusExpression
    : expression '-' unaryExpression

当然在ANTLR4中我可以做到

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

但是在生成的访问者中,我将只有expression和的方法unaryExpression。当我访问时,我应该如何知道该怎么做ExpressionContext?是加法还是减法?

4

1 回答 1

2

我在这里找到了答案。

可以像这样“标记”替代方案:

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

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

于 2013-07-10T01:47:20.547 回答