anchor.diff:  
   booleanExpression                                                                                       //Evaluation order of the operators
       : '(' booleanExpression ')'                                                 # BooleanPrecedence     // I
  -    | ISNULL_FUNC '(' booleanParam ')'                                          # BooleanIsNullFunction // II  All functional operators
  +    | FUNC_ISNULL '(' booleanParam ')'                                          # BooleanIsNullFunction // II  All functional operators
       | booleanParam op=(ISNULL|ISNOTNULL)                                        # BooleanPostfix        // ??
       | left=booleanParam op=( LE | LT | GE | GT ) right=booleanParam             # BooleanEquality       // VII
       | op=NOT booleanExpression                                                  # BooleanNot            // IV
  
positive.code:     : dateFromStringFunction
      ;
  
  dateFromStringFunction : 'date_from_string' '(' componentRef ',' format=STRING_CONSTANT ')';
  
  
  // Left recursive
  
negative.code: ISNULL : 'is null' ;
  ISNOTNULL : 'is not null' ;
  
  /* Core functions */
  
  NATIVE_FUNCTIONS : (NUMERIC_FUNCTIONS | STRING_FUNCTIONS ) ;
  nativeFunctions : NUMERIC_FUNCTIONS
                  | STRING_FUNCTIONS ;
  FUNC_ISNULL : 'isnull' ;
  
  // Numeric
  fragment NUMERIC_FUNCTIONS : ( FUNC_ROUND | FUNC_CEIL | FUNC_FLOOR | FUNC_ABS |
                        FUNC_TRUNC | FUNC_EXP  | FUNC_LN    | FUNC_LOG |
                        FUNC_POWER | FUNC_SQRT | FUNC_NROOT | FUNC_MOD |
                        FUNC_LISTSUM
                      ) ;
  
  FUNC_ROUND  : 'round' ;
  FUNC_CEIL   : 'ceil' ;
  FUNC_FLOOR  : 'floor' ;
  FUNC_ABS    : 'abs' ;
  FUNC_TRUNC  : 'trunc' ;
  FUNC_EXP    : 'exp' ;
  FUNC_LN     : 'ln' ;
  FUNC_LOG    : 'log' ;
  FUNC_POWER  : 'power' ;
  FUNC_SQRT   : 'sqrt' ;
  FUNC_NROOT  : 'nroot' ;
  FUNC_MOD    : 'mod' ;
  FUNC_LISTSUM: 'listsum' ;
  
  // String
  fragment STRING_FUNCTIONS : ( FUNC_LENGTH | FUNC_TRIM  | FUNC_LTRIM  | FUNC_RTRIM |
                       FUNC_UPPER  | FUNC_LOWER | FUNC_SUBSTR | FUNC_INSTR |
                       FUNC_D_F_S  | FUNC_REPLACE
                     ) ;
  
  FUNC_LENGTH  : 'length' ;
  FUNC_TRIM    : 'trim' ;
  FUNC_LTRIM   : 'ltrim' ;
  FUNC_RTRIM   : 'rtrim' ;
  FUNC_UPPER   : 'upper' ;
  FUNC_LOWER   : 'lower' ;
  FUNC_SUBSTR  : 'substr' ;
  FUNC_INSTR   : 'instr' ;
  FUNC_D_F_S   : 'date_from_string' ;
  FUNC_REPLACE : 'replace' ;
  
  //WS : [ \r\t\u000C] -> skip ;
  
  