lexer grammar QueryLexer;

AND_OP     : 'AND';
OR_OP      : 'OR';
SIMPLE_OP  : 'EQ' | 'NE' | 'GE' | 'GT' | 'LT' | 'LE';

REP      : 'REP';
IN       : 'IN';
AS       : 'AS';
CBF      : 'CBF';
SELECT   : 'SELECT';
FROM     : 'FROM';
FILTER   : 'FILTER';
WILDCARD : '*';

CLAUSE_SAME     : 'SAME';
CLAUSE_DISTINCT : 'DISTINCT';

L_PAREN : '(';
R_PAREN : ')';
AT      : '@';

IDENT             : Nondigit (Digit | Nondigit)* ;
fragment Digit    : [0-9] ;
fragment Nondigit : [a-zA-Z_] ;

NUMBER1 : [1-9] Digit* ;
ZERO    : '0' ;

// Taken from antlr4 json grammar with minor corrections.
// https://github.com/antlr/grammars-v4/blob/master/json/JSON.g4
STRING : '"'  (ESC | SAFECODEPOINTDOUBLE)* '"'
       | '\'' (ESC | SAFECODEPOINTSINGLE)* '\'' ;

fragment ESC : '\\' (['"\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;
fragment SAFECODEPOINTSINGLE : ~ ['\\\u0000-\u001F] ;
fragment SAFECODEPOINTDOUBLE : ~ ["\\\u0000-\u001F] ;

WS : [ \t\n\r] + -> skip ;