xref: /template/strap/grammar/PageSql.g4 (revision 5b7a56ccb7c57144ce99d82ebd684c7eb5d4f441)
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