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的專家,但這也意味着我沒有看到我在這裏做錯了什麼。
有人能幫助我嗎?
乾杯
謝謝,這似乎已經做到了! – bkwint 2012-08-08 06:25:12