我打算构建一个简单的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)*
;