我发现自己遇到了挑战,即当原始规则中出现某些条件时,如何正确设置重写规则的格式。

什么是重写此代码的适当方法:

unaryExpression: op=('!' | '-') t=term
  -> ^(UNARY_EXPR $op $t)

Antlr似乎不喜欢我在括号中用标签标记任何内容,并且“op =”失败。另外,我尝试了:
unaryExpression: ('!' | '-') t=term
  -> ^(UNARY_EXPR ('!' | '-') $t)

Antlr不喜欢或'|'并引发语法错误。

用标记符名称替换字符类确实可以解决此问题,但是它会使我的语法出现其他问题。

-编辑-

添加了第二个问题。请帮我用树语法格式化此规则:
multExpression : unaryExpression (MULT_OP unaryExpression)* ;
非常简单:我的期望是将每个匹配的令牌都括在父(虚构)令牌MULT中,以便最终得到类似以下内容的代码:
 MULT
  o
  |
  o---o---o---o---o
  |   |   |   |   |
 '3' '*' '6' '%'  2

最佳答案

unaryExpression
    :    (op='!' | op='-') term
         -> ^(UNARY_EXPR[$op] $op term)
    ;

我使用了UNARY_EXPR[$op],以便根节点获得一些有用的行/列信息,而不是默认为-1。

10-07 19:06
查看更多