1

次のルールがあります。

statement : TOKEN1 opt1=TOKEN2? opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1? opt2);

このルールによって生成された AST には、(opt1 が定義されているかどうかに応じて) 1 つまたは 2 つの子が含まれます。

常に一定数の子 (この場合は 2) が必要です。これは、次の手順を実行することで実現できることを知っています (UNDEFINEDは架空のトークンです)。

statement : TOKEN1 opt1=TOKEN2 TOKEN4 -> ^(TOKEN1 opt1 UNDEFINED)

           | TOKEN1 opt1=TOKEN2 opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1 opt2);

これは、オプションのトークンが 1 つだけの場合に問題ありません。問題は、オプションのトークンの数が多い場合です。考えられるすべての組み合わせを把握するには、多くのルールを記述する必要があります。この問題をエレガントな方法で解決するにはどうすればよいですか?

ちなみに、ANTLR 3.4/C ターゲットを使用しています。

ありがとう、

T.

4

1 に答える 1

0

あなたはこれを行うことができます:

grammar G;

tokens {
  CHILD1;
  CHILD2;
  CHILD3;
}

...

statement
 : ROOT t2=TOKEN2? t3=TOKEN3? t4=TOKEN4?
   -> ^(ROOT ^(CHILD1 $t2?) ^(CHILD2 $t3?) ^(CHILD3 $t4?))
 ;

これにより、AST は常に 3 つの子ノードを持ちます (子自体としてトークンを持つ場合と持たない場合があります)。

于 2013-08-29T07:00:08.797 に答える