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