Hi everyone!
I am planning to build a simple sql parser to analyze mysql statements. I use antlr3 to build this parser. here is a piece of my antlr3 file.
this file works fine for some sql statement, but others will cause a exception.
for example, "set @@global.sysvar = 123" and "set @@session.sysvar = 123" works fine.
but "set global sysvar = 123" and "set session sysvar" will cause a exception : Recognition exception MismatchedTokenException(0!=0) and Error node 3 (,1:4], resync=set global 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)*
;