2013-02-12 34 views
3

我正在使用ANTLR 3執行以下操作。ANTLR3:匹配所有內容直到指定的關鍵字

假設我有一個SQL查詢。我知道,通常它是WHERE,ORDER BY和GROUP BY子句是可選的。就ANTLR的語法而言,我會這樣描述:

 
query : select_clause from_clause where_clause? group_by_clause? order_by_clause? 

每個子句的規則顯然都以各自的關鍵字開始。

我真正需要的是將每個子句的內容作爲一個字符串提取出來,而不涉及其內部結構。

要做到這一點,我開始用下面的語法:

 
query : 
    select_clause from_clause where_clause? group_by_clause? order_by_clause? 
EOF; 

select_clause : 
    SELECT_CLAUSE 
; 

from_clause : 
    FROM_CLAUSE 
; 

where_clause : 
    WHERE_CLAUSE 
; 

group_by_clause : 
    GROUP_BY_CLAUSE 
; 

order_by_clause : 
    ORDER_BY_CLAUSE 
; 

SELECT_CLAUSE : 'select' ANY_CHAR*; 

FROM_CLAUSE : 'from' ANY_CHAR*; 

WHERE_CLAUSE : 'where' ANY_CHAR*; 

GROUP_BY_CLAUSE : 'group by' ANY_CHAR*; 

ORDER_BY_CLAUSE : 'order by' ANY_CHAR*; 

ANY_CHAR : .; 

WS : ' '+ {skip();}; 

這一個沒有工作。我已經進一步嘗試撰寫正確的語法,但沒有成功。我懷疑這個任務對ANTLR3是可行的,但我只是缺少水手。

更一般地說,我希望能夠將來自輸入流的字符收集到單個令牌中,直到遇到指示新令牌開始的特定關鍵字。該關鍵字應該是新令牌的一部分。

你能幫助我嗎?

回答

2

而不是將它們添加到您的標記,爲什麼不將ANY_CHAR*轉移到解析器規則呢?您甚至可以使用重寫規則將這些單個令牌「粘合」在一起。

一個快速演示:

grammar T; 

options { output=AST; } 
tokens { QUERY; ANY; } 

query   : select_clause from_clause where_clause? group_by_clause? order_by_clause? EOF 
        -> ^(QUERY select_clause from_clause where_clause? group_by_clause? order_by_clause?) 
       ; 
select_clause : SELECT_CLAUSE^ any; 
from_clause  : FROM_CLAUSE^ any; 
where_clause : WHERE_CLAUSE^ any; 
group_by_clause : GROUP_BY_CLAUSE^ any; 
order_by_clause : ORDER_BY_CLAUSE^ any; 
any    : ANY_CHAR* -> ANY[$text]; 

SELECT_CLAUSE : 'select'; 
FROM_CLAUSE  : 'from'; 
WHERE_CLAUSE : 'where'; 
GROUP_BY_CLAUSE : 'group' S+ 'by'; 
ORDER_BY_CLAUSE : 'order' S+ 'by'; 
ANY_CHAR  : . ; 
WS    : S+ {skip();}; 

fragment S  : ' ' | '\t' | '\r' | '\n'; 

如果你現在解析輸入:

select JUST ABOUT ANYTHING from YOUR BASEMENT order by WHATEVER

以下AST將被創建:

enter image description here

試圖做同樣的事情在你的詞法分析器中會很混亂,並且意味着一些自定義代碼(或者謂詞)來檢查char-stream中的關鍵字(兩者都不太好!)。

+0

謝謝巴特! 這個語法有一些小問題(例如,如果WHERE子句包含'或'運算符),但你給了我一個很好的起點。 因爲我還不是很熟悉用ANTLR構建AST,所以我需要花一些時間來充分理解答案。 – preeze 2013-02-17 11:42:41

相關問題