3

当原始规则中出现某些条件时,我发现自己面临如何正确格式化重写规则的挑战。

重写这个的适当方法是什么:

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

Antlr 似乎不喜欢我在括号中用标签标记任何东西,“op=”失败。另外,我试过:

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

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

用标记名称替换字符类确实解决了这个问题,但是它给我的语法带来了其他问题的泥潭。

- - 编辑 - -

增加了第二个问题。请帮我用树语法格式化这个规则:

multExpression : unaryExpression (MULT_OP unaryExpression)* ;

非常简单:我的期望是将每个匹配的标记包含在父(想象的)标记MULT中,这样我最终会得到类似的东西:

 MULT
  o
  |
  o---o---o---o---o
  |   |   |   |   |
 '3' '*' '6' '%'  2
4

1 回答 1

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

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

于 2010-02-27T03:36:12.803 回答