2

私の ANTLR 文法には、クエリが単一のフラグメントまたは PLUS 記号で結合されたフラグメントのリストであるというルールがあります。出力として AST を生成していますが、できるようにしたいのは、フラグメントの数に応じてノードを書き換えることです。

フラグメントが 1 つある場合、ノードは 1 つだけである必要があります。複数のフラグメントがある場合は、ルート ノードを PLUS にし、すべてのフラグメントを子にしたいと考えています。これは可能ですか?

query
    : frag (PLUS frag)*  -> ^(PLUS frag*)
    ;
4

1 に答える 1

2

確かに、次のように書き換えルール内で述語を使用できます。

p
 : M N? P? -> {boolean-expression-1}? ^(rewrite-rule-1)
           -> {boolean-expression-2}? ^(rewrite-rule-2)
           ->                         ^(rewrite-rule-3)
 ;

あなたの場合、PLUSブール式でトークンの存在を確認するだけです。

query
 : frag (PLUS frag)* -> {$PLUS != null}? ^(PLUS frag+)
                     ->                  frag
 ;

frag
 : ID
 ;

ID
 : 'a'..'z'+
 ;

PLUS
 : '+'
 ;

fragment(これは ANTLR の予約済みキーワードであることに注意してください)

次のような入力は次のよう"a"に解析されます。

ここに画像の説明を入力

そして"a+b+c+d"次のように:

ここに画像の説明を入力

二分木を探しているわけではないと思いますよね?ただし、インライン ツリー演算子を使用すると、次の^ように簡単になります。

query
 : frag (PLUS^ frag)*
 ;

の次の AST を作成します"a+b+c+d"

ここに画像の説明を入力

于 2012-06-06T20:10:15.150 に答える