我正在将我的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)*
;