2012-04-30 79 views
1

我试图建立一个AST使用ANTLRANTLR的AST建设

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

对于上述如何建立在NOT IN或IN取决于输入根树下面的语法?或者有没有更好的办法?

而且像类型的字典,我怎么构建一个AST,树MAP为根本,为每个键子MAP_PAIR蟒蛇:值应该是太好了,我猜

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

我试着用标签几个备选方案和树重写但antrlworks总是抱怨

任何帮助,将不胜感激

回答

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) 
; 

// ... 
+0

感谢Bart ......你好像是SO的Antlr的权威。 –

+0

不客气@jack_carver。你知道他们说什么:*在盲人的土地上,独眼的人是国王* :) –