元のルールで特定の条件が発生したときに、書き換えルールを適切にフォーマットする方法に挑戦していることに気づきました。
これを書き換える適切な方法は次のとおりです。
unaryExpression: op=('!' | '-') t=term
-> ^(UNARY_EXPR $op $t)
Antlr は、括弧内にラベルを付けてブランド化するのが好きではないようで、「op =」は失敗します。また、私は試しました:
unaryExpression: ('!' | '-') t=term
-> ^(UNARY_EXPR ('!' | '-') $t)
Antlr は or '|' を好みません 文法エラーをスローします。
文字クラスをトークン名に置き換えると、この問題は解決しますが、私の文法に他の問題が生じます。
- - 編集 - -
2 番目の問題が追加されました。このルールをツリー文法でフォーマットするのを手伝ってください:
multExpression
: unaryExpression (MULT_OP unaryExpression)*
;
非常に単純です: 私の期待は、一致したすべてのトークンを親 (架空の) トークンで囲み、次のMULT
ような結果になるようにすることです。
MULT
o
|
o---o---o---o---o
| | | | |
'3' '*' '6' '%' 2