2012-08-07 3 views
0

우둔 해요, 나에게 NoViableAltException를 알려줍니다. 이 문법을 사용하여 프로그래머가 mysql 쿼리를 만들 수있게하고 응용 프로그램이 쿼리를 필요한 데이터베이스의 적절한 형식으로 자동 변경합니다. 당신이 당신의 쿼리에서 LIMIT 0.5을 사용하는 경우, 예를 들어ANTLR 내가 현재 SQL 문을 받아들이는 ANTLR 문법에서 일하고 있어요

가 자동으로 지금까지이 내 문법까지입니다 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 

그것이 나에게 NoViableAltException을 제공하는 시점에서 AND 즐 = @b에서 내 쿼리를 구문 분석 중지 ... 나는 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