Antlr4中的Antr3规则重写



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

最新更新