2015-02-09 4 views
1

Недавно я переместил код SQL-анализатора из paraboiled в ANTLR, и это была очень плавная миграция, однако я получаю это сообщение об ошибке конкретно, когда мой SQL содержит AND или OR условный оператор. Я использую образец грамматики, буду признателен за любую помощь.Не распознающий токен

Если я пытаюсь разобрать этот образец SQL "SELECT Name,Age,Salary FROM Employee WHERE Age=12 AND Dept=15"

я линия 1:50 несовпадающий вход «и» ожидая {, OPAND, ОПОРы}

Однако, если я заменить ниже правил, то это работает , я пытаюсь реализовать анализ без учета регистра

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

Из-за заказа ваших правил лексер рассматривает И как идентификатор, а не ключевое слово. Если вы измените раздел правила lexer на следующий, строка «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: [=><]+ ; 
Смежные вопросы