在 Antlr4 中重写 Antr3 规则

Antr3 rule rewriting in Antlr4

我正在将我的 antlr3 语法升级到 antlr4,但发现 antl3 不支持规则重新布线,感谢任何建议让下面的语法在 Antlr4 中工作?

fragment date
    : DATE (MINUS DATE)* -> ^(TO DATE+)
    ;

fragment simpleExpression
    : expr (OR expr)* -> expr+
    ;

fragment simpleExpressionWithLiteral
    : exprWithLiteral (OR exprWithLiteral)* -> exprWithLiteral+
    ;

fragment conditionalExpression
    : orExpression -> ^(COND orExpression)?
    ;

fragment orExpression
    : andExpression (OR^ andExpression)*
    ;

fragment andExpression
    : atom (AND^ atom)*
    ;

fragment atom
    : exprWithLiteral
    | NOT exprWithLiteral -> ^(NOT exprWithLiteral)
    | NOT LPAREN orExpression RPAREN-> ^(NOT orExpression)
    | LPAREN orExpression RPAREN -> orExpression
    ;

fragment exprWithLiteral
    : expr
    | StringLiteral
    ;

fragment expr
    : WORD
    | NUMBER
    ;

->之后的部分不是规则重写而是树重写。 ANTLR3 生成了一个 AST,您可以使用此树重写语法手动更改它。 ANTLR4 不再生成 AST,而是解析树,您无法更改(因为它们代表通过语法的路径)。

所以简单的解决方案是删除以 -> 开头的行中的所有内容,示例:

fragment date
    : DATE (MINUS DATE)* -> ^(TO DATE+)
    ;

变成

fragment date
    : DATE (MINUS DATE)*
    ;