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是可行的,但我只是缺少水手。
更一般地說,我希望能夠將來自輸入流的字符收集到單個令牌中,直到遇到指示新令牌開始的特定關鍵字。該關鍵字應該是新令牌的一部分。
你能幫助我嗎?
謝謝巴特! 這個語法有一些小問題(例如,如果WHERE子句包含'或'運算符),但你給了我一個很好的起點。 因爲我還不是很熟悉用ANTLR構建AST,所以我需要花一些時間來充分理解答案。 – preeze 2013-02-17 11:42:41