2012-04-30 109 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。你知道他們說什麼:*在盲人的土地上,獨眼的人是國王* :) –