anchor.diff:  OUTER : 'outer' ;
   CROSS : 'cross' ;
   
  -// For tests only
  -//varID               : 'varID' NUM+;
  -//variableRef         : ( 'varName' | 'constant' ) NUM+;
  -//datasetExpression   : 'datasetExpr' NUM*;
  -dimensionExpression : 'dimensionExpr' NUM*;
  -//constant            : NUM ;
  -
  -NUM : '0'..'9' ;
  -
  -//WS          : [ \t\n\t] -> skip ;
  -
  +IDENTIFIER:LETTER(LETTER|'_'|DIGIT)* ;
  +
  +INTEGER_CONSTANT  : DIGIT+;
  +BOOLEAN_CONSTANT  : 'true' | 'false' ;
  +STRING_CONSTANT   :'"' (~'"')* '"';
  +
  +FLOAT_CONSTANT    : (DIGIT)+ '.' (DIGIT)* FLOATEXP?
  +                  | (DIGIT)+ FLOATEXP
  +                  ;
  +
  +NULL_CONSTANT     : 'null';
  +
  +PLUS : '+';
  +MINUS : '-';
  +
  +fragment DIGIT    : '0'..'9' ;
  +fragment FLOATEXP : ('e'|'E')(PLUS|MINUS)?('0'..'9')+;
  +fragment LETTER   : 'A'..'Z' | 'a'..'z';
  +
  +WS : [ \n\r\t\u000C] -> skip ;
  +COMMENT : '/*' .*? '*/' -> skip;
  +
  
positive.code: 
  datasetId : STRING_CONSTANT ;
  
  WS : [ \n\r\t\u000C] -> skip ;
  COMMENT : '/*' .*? '*/' -> skip;
  
  
  /* Atom */
  exprAtom : variableRef;
  
  
negative.code: 
  constant : INTEGER_CONSTANT | FLOAT_CONSTANT | BOOLEAN_CONSTANT | STRING_CONSTANT | NULL_CONSTANT;
  
  
  clauseExpression      : '[' clause ']' ;
  
  