Skip to content

Instantly share code, notes, and snippets.

@nithinivi
Created August 29, 2025 13:17
Show Gist options
  • Select an option

  • Save nithinivi/db7de0cdaa2abf4420b90c2badcb32e6 to your computer and use it in GitHub Desktop.

Select an option

Save nithinivi/db7de0cdaa2abf4420b90c2badcb32e6 to your computer and use it in GitHub Desktop.
grammar SPQL;
// ---- Parser rule ----
//
spql
: condition EOF
;
condition
: disjunction?
;
disjunction
: conjunction (OR conjunction)*
;
conjunction
: predicate (AND predicate)*
;
predicate
: LPAREN condition RPAREN
| NOT predicate
| simple_predicate
;
simple_predicate
: column comp_op value
| column IN LPAREN value_list RPAREN
| column BETWEEN range_value AND range_value
;
comp_op
: EQ
| NEQ
| LT
| LTE
| GT
| GTE
;
column
: UNQUOTED_STRING | path_string
;
path_string
: DOLLAR UNQUOTED_STRING DOLLAR path_part*
;
path_part
: DOT UNQUOTED_STRING
| LBRACK UNQUOTED_STRING RBRACK
| LBRACK NUMBER RBRACK
;
value_list
: value (COMMA value)*
;
value
: QUOTED_STRING
| range_value
;
range_value
: NUMBER
| DATE_LITERAL
| TIME_LITERAL
| RELATIVE_TIME
;
// ---- Lexer rule ----
//
NOT : 'NOT';
AND : 'AND';
OR : 'OR';
IN : 'IN';
BETWEEN : 'BETWEEN';
EQ : '=';
NEQ : '<>';
LT : '<';
LTE : '<=';
GT : '>';
GTE : '>=';
LPAREN : '(';
RPAREN : ')';
COMMA : ',';
DOT : '.';
LBRACK : '[';
RBRACK : ']';
DOLLAR : '$';
// date
RELATIVE_TIME
: NUMBER RELATIVE_UNIT
;
DATE_LITERAL
: DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT
;
TIME_LITERAL
: DIGIT DIGIT ':' DIGIT DIGIT (':' DIGIT DIGIT)?
;
// number
NUMBER
: '-'? INT ('.' [0-9]+)? EXP?
;
// string
QUOTED_STRING
: '"' (ESC | ~["\\\r\n])* '"'
;
UNQUOTED_STRING
: UNQUOTED_CHAR+
;
// ---- Fragments ----
fragment RELATIVE_UNIT
: [dDhHmMyY]
;
// Number
fragment INT
: [0-9]+
// : '0'
// | [1-9] [0-9]*
;
fragment EXP
: [Ee] [+-]? [0-9]+
;
// String
fragment UNQUOTED_CHAR
: LETTER
| DIGIT
| SYMBOL
;
fragment LETTER
: [a-zA-Z]
;
fragment NON_DIGIT
: [a-zA-Z_]
;
fragment DIGIT
: [0-9]
;
fragment SYMBOL
: [_]
;
fragment ESC
: '\\' (["\\/bfnrt] | UNICODE)
;
fragment UNICODE
: 'u' HEX HEX HEX HEX
;
fragment HEX
: [0-9a-fA-F]
;
WS
: [ \t\n\r]+ -> skip
;
@nithinivi
Copy link
Author

nithinivi commented Aug 29, 2025

NOT (NOT  colum1 > 1 AND  createdDate > -30d )
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment