ANTLR 3.x - 如何格式化重写规则

时间:2010-02-27 03:15:48

标签: antlr antlr3 tree-grammar

我发现自己在如何在原始规则中出现某些条件时正确格式化重写规则时遇到了挑战。

重写此内容的恰当方法是什么:

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

1 个答案:

答案 0 :(得分:2)

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

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