anchor.diff:      | '@@' ( ~('\r' | '\n') )* (NEWLINE|EOF)
       ;
   
  -//{ Rule #360 <NEWLINE>
   fragment
   NEWLINE: '\r'? '\n';
       
  
positive.code: fragment QS_PAREN   : QUOTE '(' .*? ')' QUOTE ;
  fragment QS_OTHER_CH: ~('<' | '{' | '[' | '(' | ' ' | '\t' | '\n' | '\r');
  
  // Rule #163 <DELIMITED_ID>
  DELIMITED_ID: '"' (~('"' | '\r' | '\n') | '"' '"')+ '"' ;
  
  // Rule #546 <SQL_SPECIAL_CHAR> was split into single rules
  PERCENT: '%';
  AMPERSAND: '&';
  LEFT_PAREN: '(';
  RIGHT_PAREN: ')';
  DOUBLE_ASTERISK: '**';
  ASTERISK: '*';
  PLUS_SIGN: '+';
  MINUS_SIGN: '-';
  COMMA: ',';
  SOLIDUS: '/';
  AT_SIGN: '@';
  ASSIGN_OP: ':=';
      
  // See OCI reference for more information about this
  BINDVAR
      : ':' SIMPLE_LETTER  (SIMPLE_LETTER | [0-9] | '_')*
      | ':' DELIMITED_ID  // not used in SQL but spotted in v$sqltext when using cursor_sharing
  
negative.code: SPACES: [ \t\r\n]+ -> skip;
  
      
  // Rule #504 <SIMPLE_LETTER> - simple_latin _letter was generalised into SIMPLE_LETTER
  //  Unicode is yet to be implemented - see NSF0
  fragment
  SIMPLE_LETTER
      : [A-Z]
      ;
  
  fragment
  FLOAT_FRAGMENT
      : UNSIGNED_INTEGER* '.'? UNSIGNED_INTEGER+
      ;
  
  // Rule #097 <COMMENT>
  
  SINGLE_LINE_COMMENT: '--' ~('\r' | '\n')* (NEWLINE | EOF)   -> channel(HIDDEN);
  MULTI_LINE_COMMENT:  '/*' .*? '*/'                          -> channel(HIDDEN);
  
  // SQL*Plus prompt
  // TODO should be grammar rule, but tricky to implement
  
  PROMPT
      : 'prompt' SPACE ( ~('\r' | '\n') )* (NEWLINE|EOF)
      ;
  