3

元のルールで特定の条件が発生したときに、書き換えルールを適切にフォーマットする方法に挑戦していることに気づきました。

これを書き換える適切な方法は次のとおりです。

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
4

1 に答える 1

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

UNARY_EXPR[$op]デフォルトの -1 ではなく、ルート ノードが有用な行/列情報を取得するように を使用しました。

于 2010-02-27T03:36:12.803 に答える