anchor.diff:      : '!'
       ;
   
  +
  +LPAREN
  +    : '('
  +    ;
  +
  +RPAREN
  +    : ')'
  +    ;
  +
  +ADD
  +    : '+'
  +    ;
  +
  +SUBTRACT
  +    : '-'
  +    ;
  +
  +MULTIPLY
  +    : '*'
  +    ;
  +
  +DIVIDE
  +    : '/'
  +    ;
  +
   IDENTIFIER
       : ('a'..'z' | 'A'..'Z')  ('a'..'z'|'A'..'Z'|'0'..'9')*
       ;
  
positive.code:     : '\"' ('\"\"' | ~('\"'))* '\"'
      ;
  
  NUM_INT
      : ('0'..'9')+ (('.' ('0'..'9')+ (EXPONENT)?)?|EXPONENT)
      ;
  
  fragment
  EXPONENT
      : ('e') ('+'|'-')? ('0'..'9')+
      ;
  
  SPACE
  
negative.code:     ;
  
  arglist
      : arg (COMMA arg)*
      ;
  
  arg
      : identifier
      | (NUMBER
      | BANG
      | STRING_LITERAL)
      | variable
      ;
  
  comment
      : SEMICOLON ~(CR)*
      ;
  
  identifier
  