137748cd8SNickeau//https://github.com/antlr/grammars-v4/ 237748cd8SNickeau 337748cd8SNickeaugrammar PageSql; 437748cd8SNickeau 537748cd8SNickeau 637748cd8SNickeau/** 737748cd8SNickeau Lexer (ie token) 837748cd8SNickeau https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md 937748cd8SNickeau*/ 1037748cd8SNickeauSCOL: ';'; 1137748cd8SNickeauDOT: '.'; 1237748cd8SNickeauLPAREN: '('; 1337748cd8SNickeauRPAREN: ')'; 1437748cd8SNickeauLSQUARE: '['; 1537748cd8SNickeauRSQUARE: ']'; 1637748cd8SNickeauLCURLY: '{'; 1737748cd8SNickeauRCURLY: '}'; 1837748cd8SNickeauCOMMA: ','; 1937748cd8SNickeauBITWISEXOR : '^'; 2037748cd8SNickeauDOLLAR : '$'; 2137748cd8SNickeauEQUAL: '='; 2237748cd8SNickeauSTAR: '*'; 2337748cd8SNickeauPLUS: '+'; 2437748cd8SNickeauMINUS: '-'; 2537748cd8SNickeauTILDE: '~'; 2637748cd8SNickeauPIPE2: '||'; 2737748cd8SNickeauDIV: '/'; 2837748cd8SNickeauMOD: '%'; 2937748cd8SNickeauLT2: '<<'; 3037748cd8SNickeauGT2: '>>'; 3137748cd8SNickeauAMP: '&'; 3237748cd8SNickeauPIPE: '|'; 3337748cd8SNickeauQUESTION: '?'; 3437748cd8SNickeauLESS_THAN: '<'; 3537748cd8SNickeauLESS_THAN_OR_EQUAL: '<='; 3637748cd8SNickeauGREATER_THAN: '>'; 3737748cd8SNickeauGREATER_THAN_OR_EQUAL: '>='; 3837748cd8SNickeauEQ: '=='; 3937748cd8SNickeauNOT_EQUAL: '!='; 4037748cd8SNickeauNOT_EQ2: '<>'; 4137748cd8SNickeau 4237748cd8SNickeau/** 4337748cd8SNickeau * Key word 4437748cd8SNickeau*/ 4537748cd8SNickeauAND: A N D; 4637748cd8SNickeauAS: A S; 4737748cd8SNickeauASC: A S C; 4837748cd8SNickeauBETWEEN: B E T W E E N; 4937748cd8SNickeauBY: B Y; 5037748cd8SNickeauDESC: D E S C; 5137748cd8SNickeauESCAPE: E S C A P E; 5237748cd8SNickeauFALSE: F A L S E; 5337748cd8SNickeauFROM: F R O M; 5437748cd8SNickeauGLOB: G L O B; 5537748cd8SNickeauIN: I N; 5637748cd8SNickeauIS: I S; 5737748cd8SNickeauISNULL: I S N U L L; 5837748cd8SNickeauLIKE: L I K E; 5937748cd8SNickeauLIMIT: L I M I T; 6037748cd8SNickeauNOT: N O T; 6137748cd8SNickeauNOTNULL: N O T N U L L; 6237748cd8SNickeauNOW: N O W; 6337748cd8SNickeauNULL: N U L L; 6437748cd8SNickeauOR: O R; 6537748cd8SNickeauORDER: O R D E R; 6637748cd8SNickeauSELECT: S E L E C T; 6737748cd8SNickeauTRUE: T R U E; 6837748cd8SNickeauWHERE: W H E R E; 6937748cd8SNickeauRANDOM: R A N D O M; 7037748cd8SNickeau 7137748cd8SNickeau// Function 7237748cd8SNickeauDATE: D A T E; 7337748cd8SNickeauDATETIME: D A T E T I M E; 7437748cd8SNickeaufunctionNames: DATE | DATETIME; 7537748cd8SNickeau 76*5b7a56ccSgerardnico// constant 77*5b7a56ccSgerardnicoconstantNames: NOW; 78*5b7a56ccSgerardnico 7937748cd8SNickeau// Tables 8037748cd8SNickeauPAGES: P A G E S; 8137748cd8SNickeauBACKLINKS: B A C K L I N K S; 8204fd306cSNickeauDESCENDANTS: D E S C E N D A N T S; 8304fd306cSNickeautableNames: PAGES | BACKLINKS | DESCENDANTS; 8437748cd8SNickeau 8537748cd8SNickeau// LITERALS 8637748cd8SNickeaufragment Letter : 'a'..'z' | 'A'..'Z'; 8737748cd8SNickeau 8837748cd8SNickeaufragment HexDigit : 'a'..'f' | 'A'..'F'; 8937748cd8SNickeau 9037748cd8SNickeaufragment Digit : '0'..'9' ; 9137748cd8SNickeau 9237748cd8SNickeaufragment Exponent : ('e' | 'E') ( PLUS|MINUS )? (Digit)+; 9337748cd8SNickeau 9437748cd8SNickeaufragment RegexComponent : 9537748cd8SNickeau 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' 9637748cd8SNickeau | PLUS | STAR | QUESTION | MINUS | DOT 9737748cd8SNickeau | LPAREN | RPAREN | LSQUARE | RSQUARE | LCURLY | RCURLY 9837748cd8SNickeau | BITWISEXOR | PIPE | DOLLAR | '!' 9937748cd8SNickeau ; 10037748cd8SNickeau 10137748cd8SNickeau// https://www.sqlite.org/lang_expr.html 10237748cd8SNickeau// A string constant is formed by enclosing the string in single quotes ('). A single quote within the string can be encoded by putting two single quotes in a row - as in Pascal. C-style escapes using the backslash character are not supported because they are not standard SQL. 10337748cd8SNickeauStringLiteral : 10437748cd8SNickeau ( '\'' ( ~'\'' | '\'\'')* '\'' 10537748cd8SNickeau | '"' ( ~('"') )* '"' 10637748cd8SNickeau )+ 10737748cd8SNickeau ; 10837748cd8SNickeau 10937748cd8SNickeauCharSetLiteral 11037748cd8SNickeau : StringLiteral 11137748cd8SNickeau | '0' 'X' (HexDigit|Digit)+ 11237748cd8SNickeau ; 11337748cd8SNickeau 11437748cd8SNickeauIntegralLiteral 11537748cd8SNickeau : (Digit)+ ('L' | 'S' | 'Y') 11637748cd8SNickeau ; 11737748cd8SNickeau 11837748cd8SNickeauNumber 11937748cd8SNickeau : (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? 12037748cd8SNickeau ; 12137748cd8SNickeau 12237748cd8SNickeauNumberLiteral 12337748cd8SNickeau : Number ('D' | 'B' 'D') 12437748cd8SNickeau ; 12537748cd8SNickeau 12637748cd8SNickeauByteLengthLiteral 12737748cd8SNickeau : (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G') 12837748cd8SNickeau ; 12937748cd8SNickeau 13037748cd8SNickeau 13137748cd8SNickeau/** 13237748cd8SNickeau * Sql also does not permit 13337748cd8SNickeau * to start with a number 13437748cd8SNickeau * (just ot have no conflict with a NUMERIC_LITERAL) 13537748cd8SNickeau*/ 13637748cd8SNickeauSqlName: (Letter | Digit) (Letter | Digit | '_')*; 13737748cd8SNickeau 13837748cd8SNickeau 13937748cd8SNickeau/** 14037748cd8SNickeau* Space are for human (discard) 14137748cd8SNickeau*/ 14237748cd8SNickeauSPACES: [ \u000B\t\r\n] -> channel(HIDDEN); 14337748cd8SNickeau 14437748cd8SNickeau 14537748cd8SNickeau 14637748cd8SNickeau/** 14737748cd8SNickeau * Fragment rules does not result in tokens visible to the parser. 14837748cd8SNickeau * They aid in the recognition of tokens. 14937748cd8SNickeau*/ 15037748cd8SNickeau 15137748cd8SNickeaufragment HEX_DIGIT: [0-9a-fA-F]; 15237748cd8SNickeaufragment INTEGER_LITERAL: Digit+; 15337748cd8SNickeaufragment NUMERIC_LITERAL: Digit+ ('.' Digit*)?; 15437748cd8SNickeaufragment ALL_LITERAL_VALUE: StringLiteral | INTEGER_LITERAL | NUMERIC_LITERAL | NULL | TRUE 15537748cd8SNickeau | FALSE 15637748cd8SNickeau | NOW; 15737748cd8SNickeau 15837748cd8SNickeau 15937748cd8SNickeaufragment ANY_NAME: SqlName | StringLiteral | LPAREN ANY_NAME RPAREN; 16037748cd8SNickeaufragment A: [aA]; 16137748cd8SNickeaufragment B: [bB]; 16237748cd8SNickeaufragment C: [cC]; 16337748cd8SNickeaufragment D: [dD]; 16437748cd8SNickeaufragment E: [eE]; 16537748cd8SNickeaufragment F: [fF]; 16637748cd8SNickeaufragment G: [gG]; 16737748cd8SNickeaufragment H: [hH]; 16837748cd8SNickeaufragment I: [iI]; 16937748cd8SNickeaufragment J: [jJ]; 17037748cd8SNickeaufragment K: [kK]; 17137748cd8SNickeaufragment L: [lL]; 17237748cd8SNickeaufragment M: [mM]; 17337748cd8SNickeaufragment N: [nN]; 17437748cd8SNickeaufragment O: [oO]; 17537748cd8SNickeaufragment P: [pP]; 17637748cd8SNickeaufragment Q: [qQ]; 17737748cd8SNickeaufragment R: [rR]; 17837748cd8SNickeaufragment S: [sS]; 17937748cd8SNickeaufragment T: [tT]; 18037748cd8SNickeaufragment U: [uU]; 18137748cd8SNickeaufragment V: [vV]; 18237748cd8SNickeaufragment W: [wW]; 18337748cd8SNickeaufragment X: [xX]; 18437748cd8SNickeaufragment Y: [yY]; 18537748cd8SNickeaufragment Z: [zZ]; 18637748cd8SNickeau 18737748cd8SNickeau/** 18837748cd8SNickeau * Parser (ie structure) 18937748cd8SNickeau * https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md 19037748cd8SNickeau*/ 19137748cd8SNickeau 19237748cd8SNickeausqlNames : SqlName|Number; 19337748cd8SNickeau 19437748cd8SNickeaucolumn: sqlNames (DOT sqlNames)? (AS (sqlNames|StringLiteral))?; 19537748cd8SNickeau 19637748cd8SNickeaupattern: (StringLiteral|NumberLiteral); 19737748cd8SNickeau 19837748cd8SNickeau 19937748cd8SNickeauexpression: 200*5b7a56ccSgerardnico (SqlName|StringLiteral|NumberLiteral|Number|constantNames) 20137748cd8SNickeau | functionNames LPAREN expression? ( COMMA expression)* RPAREN 20237748cd8SNickeau; 20337748cd8SNickeau 20437748cd8SNickeaupredicate: sqlNames 20537748cd8SNickeau ( 20637748cd8SNickeau (( LESS_THAN | LESS_THAN_OR_EQUAL | GREATER_THAN | GREATER_THAN_OR_EQUAL | NOT_EQUAL | EQUAL) expression) 20737748cd8SNickeau | 20837748cd8SNickeau ( 20937748cd8SNickeau NOT? 21037748cd8SNickeau (LIKE pattern (ESCAPE StringLiteral)?) 21137748cd8SNickeau | 21237748cd8SNickeau (GLOB pattern) 21337748cd8SNickeau ) 21437748cd8SNickeau | 21537748cd8SNickeau (NOT? BETWEEN expression AND expression) 21637748cd8SNickeau | 21737748cd8SNickeau (NOT? IN LPAREN (expression ( COMMA expression)*)? RPAREN) 21837748cd8SNickeau ); 21937748cd8SNickeau 22037748cd8SNickeaucolumns: column (COMMA column)*; 22137748cd8SNickeau 22204fd306cSNickeaupredicateGroup: LPAREN predicate ((AND|OR) predicate)* RPAREN; 22304fd306cSNickeau 22404fd306cSNickeaupredicates: WHERE (predicate|predicateGroup) ((AND|OR) (predicate|predicateGroup))*; 22537748cd8SNickeau 22637748cd8SNickeautables: FROM tableNames; 22737748cd8SNickeau 22837748cd8SNickeau/** 22937748cd8SNickeau * The type of the literal value is 23037748cd8SNickeau * checked afterwards on tree traversing 23137748cd8SNickeau * otherwise there is conflict between token 23237748cd8SNickeau*/ 23337748cd8SNickeaulimit: LIMIT Number; 23437748cd8SNickeau 23504fd306cSNickeauorderBys: ORDER (RANDOM|BY orderByDef (COMMA orderByDef)*) ; 23637748cd8SNickeau 23737748cd8SNickeauorderByDef: SqlName (ASC | DESC)? ; 23837748cd8SNickeau 23937748cd8SNickeau/** 24037748cd8SNickeau* The main/root rule 24137748cd8SNickeau*/ 24237748cd8SNickeaupageSql: 24337748cd8SNickeau SELECT 24437748cd8SNickeau RANDOM? 2451fa8c418SNickeau (STAR|columns)? 24637748cd8SNickeau tables? 24737748cd8SNickeau predicates? 24837748cd8SNickeau orderBys? 24937748cd8SNickeau limit? 25037748cd8SNickeau; 251