Antlr3 MySQL Parser无法解析一些sql语句

时间:2015-01-20 12:36:27

标签: antlr3 antlrworks

我打算构建一个简单的SQL解析器来分析mysql语句。我使用antlr3来构建这个解析器。这是我的antlr3文件的一部分。

此文件适用于某些sql语句,但其他文件会导致异常。

例如," 设置@@ global.sysvar = 123 "和" 设置@@ session.sysvar = 123 "工作正常。

但" 设置全局sysvar = 123 "和" 设置会话sysvar = 123 "会引起异常:

识别异常MismatchedTokenException(0!= 0)

错误节点3(,1:4),resync =设置全局sysvarid = 123> / 0)

为什么????

grammar zhihu;

options 
{
    language=Java;
    output=AST;
    //ASTLabelType=CommonTree; 
    backtrack=true;
}

fragment A_ :    'a' | 'A';
fragment B_ :    'b' | 'B';
fragment C_ :    'c' | 'C';
fragment D_ :    'd' | 'D';
fragment E_ :    'e' | 'E';
fragment F_ :    'f' | 'F';
fragment G_ :    'g' | 'G';
fragment H_ :    'h' | 'H';
fragment I_ :    'i' | 'I';
fragment J_ :    'j' | 'J';
fragment K_ :    'k' | 'K';
fragment L_ :    'l' | 'L';
fragment M_ :    'm' | 'M';
fragment N_ :    'n' | 'N';
fragment O_ :    'o' | 'O';
fragment P_ :    'p' | 'P';
fragment Q_ :    'q' | 'Q';
fragment R_ :    'r' | 'R';
fragment S_ :    's' | 'S';
fragment T_ :    't' | 'T';
fragment U_ :    'u' | 'U';
fragment V_ :    'v' | 'V';
fragment W_ :    'w' | 'W';
fragment X_ :    'x' | 'X';
fragment Y_ :    'y' | 'Y';
fragment Z_ :    'z' | 'Z';

GLOBAL            : G_ L_ O_ B_ A_ L_  ;
SESSION            : S_ E_ S_ S_ I_ O_ N_  ;
SET : S_ E_ T_ ;

//SYSDATE                : S_ Y_ S_ D_ A_ T_ E_  ;
//SYSTEM_USER            : S_ Y_ S_ T_ E_ M_ '_' U_ S_ E_ R_  ;

EQ  : '=';
SET_VAR :   ':=' ;

COMMA : ',' ;
DOT :    '.' ;

INTEGER_NUM: ('0'..'9')+ ;

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

SYS_VAR 
    :  GLOBAL ID
    |  SESSION ID   
    | ('@@' |  ('@@' GLOBAL DOT) | ('@@' SESSION DOT)) ID 
    ;

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

set_sysvar_statement:
    SET SYS_VAR (SET_VAR | EQ) INTEGER_NUM (COMMA SYS_VAR (SET_VAR | EQ) INTEGER_NUM)*
;

0 个答案:

没有答案