grammar SimpleBoolean;
@header {
    package org.idempiere.expression.logic;
}
parse
 : expression EOF
 ;

expression
 : LPAREN expression RPAREN                       #parenExpression
 | NOT expression                                 #notExpression
 | left=expression op=comparator right=expression #comparatorExpression
 | left=expression op=binary right=expression     #binaryExpression
 | bool                                           #boolExpression
 | VARIABLE				    	    			  #contextVariables
 | QCSVTEXT										  #quotedCSVText
 | QTEXT										  #quotedText
 | DQCSVTEXT									  #doubleQuotedCSVText
 | DQTEXT										  #doubleQuotedText
 | TEXT                                     	  #text
 | DECIMAL                                        #decimalExpression
 ;

comparator
 : GT | GE | LT | LE | EQ | NE | RE
 ;

binary
 : AND | OR
 ;

bool
 : TRUE | FALSE
 ;

AND        : '&' ;
OR         : '|' ;
NOT        : '$!';
TRUE       : 'true' ;
FALSE      : 'false' ;
GT         : '>' ;
GE         : '>=' ;
LT         : '<' ;
LE         : '<=' ;
EQ         : '=' ;
NE         : [!^] ;
RE		   : '~' ;
LPAREN     : '(' ;
RPAREN     : ')' ;
DECIMAL    : '-'? [0-9]+ ( '.' [0-9]+ )? ;
VARIABLE   : '@'(.*?)'@' ;
COMMA	   : ',' ;
QCOMMA	   : '\',' ;
QTEXT 	   : ['](.*?)['] ;
QCSVTEXT   : [']~(['])*(QCOMMA)(QTEXT)(COMMA QTEXT)* ;
DQCOMMA    : '",';
DQTEXT 	   : ["](.*?)["] ;
DQCSVTEXT  : ["]~(["])*(DQCOMMA)(DQTEXT)(COMMA DQTEXT)* ;
TEXT 	   : [a-zA-Z_0-9,]+ ;
WS         : [ \r\t\u000C\n]+ -> skip;