2015-02-09 99 views
1

我最近將我的SQL解析器代碼從paraboiled移動到ANTLR,並且它非常平滑的遷移,但是當我的SQL包含AND或OR條件運算符時,我收到了此錯誤消息。我分享樣本語法,將不勝感激任何幫助。不承認令牌

如果我嘗試解析這個樣本SQL "SELECT Name,Age,Salary FROM Employee WHERE Age=12 AND Dept=15"

我得到的線不匹配1:50輸入「與」期待{,OPAND,OPOR}

但是,如果我下面的規則,然後它的作品取代,我試圖執行不區分大小寫的解析

binaryConditionalExp:binaryExp | binaryConditionalExp CONDOPERATOR =('AND'|'OR')binaryConditionalExp | binaryparenExp;

/** 
* Define a grammar called Hello 
*/ 
grammar SQLParser; 


@header 
{ 
    package somu.parsers; 
} 




prog : sqlsyntax;   // match keyword hello followed by an identifier 


sqlsyntax : (selectclause fromclause whereclause) | (selectclause fromclause) ; 
selectclause : 'SELECT' columnclause; 

columnclause : columnName (',' columnName)*; 

columnName : columnLiteral; 
columnLiteral : ID | sqlsyntax; 

fromclause : 'FROM' tableclause; 
tableclause : (tableclausealiaswithas | tableclauseplainalias | tableclausenoalias); 
tableclausenoalias : ID | ; 
tableclausealiaswithas : ID 'as' ID; 
tableclauseplainalias : ID ID; 

whereclause : 'WHERE' binarystmt; 

binarystmt : binaryConditionalExp; 
binaryExp: columnName OPERATOR columnName; 
binaryparenExp: '(' binaryConditionalExp ')'; 
binaryConditionalExp: binaryExp | 
         binaryConditionalExp CONDOPERATOR=(OPAND | OPOR) binaryConditionalExp | 
         binaryparenExp; 



ID : [a-zA-Z0-9]+ ;    // match identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 
OPERATOR: [=><]+ ; 
OPAND : A N D ; 
OPOR : O R; 

fragment DIGIT : [0-9]; 
fragment A : [aA]; 
fragment B : [bB]; 
fragment C : [cC]; 
fragment D : [dD]; 
fragment E : [eE]; 
fragment F : [fF]; 
fragment G : [gG]; 
fragment H : [hH]; 
fragment I : [iI]; 
fragment J : [jJ]; 
fragment K : [kK]; 
fragment L : [lL]; 
fragment M : [mM]; 
fragment N : [nN]; 
fragment O : [oO]; 
fragment P : [pP]; 
fragment Q : [qQ]; 
fragment R : [rR]; 
fragment S : [sS]; 
fragment T : [tT]; 
fragment U : [uU]; 
fragment V : [vV]; 
fragment W : [wW]; 
fragment X : [xX]; 
fragment Y : [yY]; 
fragment Z : [zZ]; 

回答

2

由於規則的排序,詞法分析器認爲AND是標識符,而不是關鍵字。如果將詞法分析器規則部分更改爲以下內容,則字符串「AND」會正確標記爲OPAND。

// match RESERVED WORDS first 
OPAND : A N D ; 
OPOR : O R; 

// match IDENTIFIERS etc. 
ID : [a-zA-Z0-9]+ ; 
WS : [ \t\r\n]+ -> skip ; 
OPERATOR: [=><]+ ;