2012-08-07 32 views
0

我目前正在接受SQL語句的ANTLR語法。我想使用這個語法來允許程序員創建mysql查詢,應用程序會自動將查詢變成適合所需數據庫的格式。Antlr告訴我NoViableAltException,我很無力

例如,如果你在你的查詢中使用LIMIT 0,5它會自動變換此查詢到正確的格式爲MSSQL

這是我的語法到現在爲止

grammar sql2; 

query 
    : select ';'? EOF 
    ; 

select 
    : 'SELECT' top? select_exp 'FROM' table ('WHERE' compare_exp)? limit? 
    ; 

compare_exp 
    : field CompareOperator param (BooleanOperator compare_exp)? 
    ; 

param 
    : '@' ID 
    ; 

top 
    : 'TOP' INT 
    ; 

limit 
    : 'LIMIT' INT (',' INT)? 
    ; 

select_exp 
    : field (',' select_exp)? 
    ; 

table 
    : '`' ID '`' ('.`' ID '`')? 
    | ID ('.' ID)? 
    ; 

field 
    : table 
    ; 

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 

CompareOperator 
    : ('=' | '<>') 
    ; 

BooleanOperator 
    : ('AND' | 'OR') 
    ; 

INT : '0'..'9'+ 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

如果我測試這個與輸入

SELECT TOP 5 bla_asdf, bal, lab FROM `x`.`y` WHERE xdf = @tf AND bla = @b LIMIT 0, 5 

停靠在和喇嘛= @b解析我的查詢,在這一點上它給了我一個NoViableAltException ... 如果我把INP ut

SELECT TOP 5 bla_asdf, bal, lab FROM `x`.`y` WHERE xdf = @tf LIMIT 0, 5 

它不會給我帶來任何問題。

我絕對沒有ANTLR的專家,但這也意味着我沒有看到我在這裏做錯了什麼。

有人能幫助我嗎?

乾杯

回答

1

並且被標記化作爲ID,這是因爲第一詞法規則匹配的最長輸入片段勝。

所以你應該在ID之前定義BooleanOperator。

+0

謝謝,這似乎已經做到了! – bkwint 2012-08-08 06:25:12