1

ANTLRを使用して以下の文法のASTを構築しようとしています

condition_in
    :   column_identifier ('NOT')? 'IN' (sql_element_list | LPAREN select_stmt RPAREN)
    ;

上記の場合、入力に応じて NOT IN または IN でルートツリーを構築するにはどうすればよいですか? または何か良い方法はありますか?

また、辞書のようなPythonの場合、ルートとしてMAPを持ち、各キーの子MAP_PAIRを持つastツリーを構築するにはどうすればよいですか:値は素晴らしいはずです

map :   '{' collection_element':'collection_element (',' collection_element':'collection_element)* '}'

ラベルとツリーの書き換えでいくつかの代替案を試しましたが、antrlworks は常に文句を言います

どんな助けでもいただければ幸いです

4

1 に答える 1

1

次のようなことを試してください:

grammar T;

options {
  output=AST;
}

tokens {
  NOT_IN;
  MAP_PAIR;
  MAP;
}

condition_in
 : column_identifier ( 'NOT' 'IN' in_end -> ^(NOT_IN column_identifier in_end)
                     | 'IN' in_end       -> ^('IN' column_identifier in_end)
                     )
 ;

in_end
 : sql_element_list 
 | LPAREN select_stmt RPAREN -> select_stmt
 ;

map
 : '{' (entry (',' entry)*)? '}' -> ^(MAP entry*)

entry
 : k=collection_element ':' v=collection_element -> ^(MAP_PAIR $k $v)
 ;

// ...
于 2012-04-30T06:19:50.300 に答える