anchor.diff:          (
            COMMA right=expr      { e.addChild(right);                               }
           )*
  -      ) RPAREN
  +      )? RPAREN
       )
     );
     
  
positive.code:   
    // CONVERSION FUNCTIONS
    TO_NUM    = "to_num";
    TO_UNIT   = "to_unit";
  }
  
  IDENTIFIER options { testLiterals = true; }:
  
negative.code:   { e = context.createExpression(LT(0).getText()); };
        
  function returns [FunctionIF f]:
    ( f=aggregate_function
    | f=simple_function
    );      
    
  aggregate_function returns [FunctionIF f]:
    ( COUNT | SUM | MAX | MIN | AVG | CONCAT)
    { f = context.createFunction(LT(0).getText()); };
    
  simple_function returns [FunctionIF f]:
    ( LOWERCASE | UPPERCASE | TITLECASE | LENGTH | SUBSTR | TRIM | TO_NUM)
    { f = context.createFunction(LT(0).getText()); };
  
  functionparam:
  