1

次のような変数の型を繰り返す必要のない変数宣言を文法でサポートできるようにしようとしています。int i = 3, j = 4, k;

私が抱えている問題は、生成されたツリーにあります。これが私のルールです...

varDeclaration
:   type ID (ASSIGN expression)? (COMMA ID (ASSIGN expression)?)* SEMICOLON -> ^(VAR_DECL type ID expression?)+;

宣言を個別の変数宣言に正常に分割しますが、それらすべてに対して式ツリーを繰り返しています。

したがって、 の場合、両方ともAST でint x = 4, y = 5値を持ちます。4

オペレーターまたは私が使用できる何かの助けをいただければ幸いです。

4

1 に答える 1

2

ANTLRはexpressionsを区別することはできません。AFAIK、「ヘルパー」ルールを作成する必要があります。

簡単なデモ:

options {
  output=AST;
  ASTLabelType=CommonTree; // <- important, otherwise `$t.tree` returns an Object instead of a CommonTree
}

tokens {
  VAR_DECLS;
  VAR_DECL;
}

// ...

varDeclaration 
 : t=type assign[$t.tree] (COMMA assign[$t.tree])* SEMICOLON -> ^(VAR_DECLS assign+)
 ;

assign[CommonTree type]
 : ID (ASSIGN expression)? -> ^(VAR_DECL {type} ID expression?)
 ;

// ...

これで、入力により次のASTが生成されます。

ここに画像の説明を入力してください

編集

type-nodeはすべてのVAR_DECLノードで同じになることに注意してください。これは問題ではないかもしれませんが(このノードはおそらく変更されないため)、各VAR_DECLノードにタイプノードの独自のインスタンスを持たせたい場合は、次のようにします。

assign[CommonTree type]
 : ID (ASSIGN expression)? -> ^(VAR_DECL {new CommonTree(type)} ID expression?)
 ;

または同様のもの。{および}リライトルール内でプレーンターゲットコードを使用できます。

于 2012-09-10T20:11:02.900 に答える