我发现自己遇到了挑战,即当原始规则中出现某些条件时,如何正确设置重写规则的格式。
什么是重写此代码的适当方法:
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。