anchor.diff:      ;
   
   PERIOD
  -    :    '.'
  +    : '.'
       ;
   
   //{ Rule #238 <EXACT_NUM_LIT> 
  
positive.code: 
  // NOTE: In reality this applies to aggregate functions only
  keep_clause
      :   KEEP
          '('
              DENSE_RANK (FIRST|LAST)
               order_by_clause
          ')' over_clause?
      ;
  
  function_argument
      :    '(' 
              argument? (',' argument )* 
          ')'
          keep_clause?
      ;
  
  function_argument_analytic
      :    '('
              (argument respect_or_ignore_nulls?)?
              (',' argument respect_or_ignore_nulls? )*
           ')'
           keep_clause?
      ;
  
  function_argument_modeling
      :    '('
              column_name (',' (numeric|NULL) (',' (numeric|NULL) )? )?
              USING
                  ( tableview_name '.' '*'
                  | '*'
                  | expression column_alias? (',' expression column_alias?)*
                  )
           ')'
           keep_clause?
      ;
  
  respect_or_ignore_nulls
      :    (RESPECT | IGNORE) NULLS
      ;
  
  argument
      :    (id '=' '>')? expression_wrapper
      ;
  
  type_spec
      :     datatype
      |    REF? type_name (PERCENT_ROWTYPE|PERCENT_TYPE)?
      ;
  
  datatype
      :    native_datatype_element
          precision_part?
          (WITH LOCAL? TIME ZONE)?
      |    INTERVAL (YEAR|DAY)
                  ('(' expression_wrapper ')')? 
              TO (MONTH|SECOND) 
                  ('(' expression_wrapper ')')?
      ;
  
  precision_part
      :    '(' numeric (',' numeric)? (CHAR | BYTE)? ')'
      ;
  
  native_datatype_element
      :    BINARY_INTEGER
      |    PLS_INTEGER
      |    NATURAL
      |    BINARY_FLOAT
      |    BINARY_DOUBLE
      |    NATURALN
      |    POSITIVE
      |    POSITIVEN
      |    SIGNTYPE
      |    SIMPLE_INTEGER
      |    NVARCHAR2
      |    DEC
      |    INTEGER
      |    INT
      |    NUMERIC
      |    SMALLINT
      |    NUMBER
      |    DECIMAL 
      |    DOUBLE PRECISION?
      |    FLOAT
      |    REAL
      |    NCHAR
      |    LONG RAW?
      |    CHAR  
      |    CHARACTER 
      |    VARCHAR2
      |    VARCHAR
      |    STRING
      |    RAW
      |    BOOLEAN
      |    DATE
      |    ROWID
      |    UROWID
      |    YEAR
      |    MONTH
      |    DAY
      |    HOUR
      |    MINUTE
      |    SECOND
      |    TIMEZONE_HOUR
      |    TIMEZONE_MINUTE
      |    TIMEZONE_REGION
      |    TIMEZONE_ABBR
      |    TIMESTAMP
      |    TIMESTAMP_UNCONSTRAINED
      |    TIMESTAMP_TZ_UNCONSTRAINED
      |    TIMESTAMP_LTZ_UNCONSTRAINED
      |    YMINTERVAL_UNCONSTRAINED
      |    DSINTERVAL_UNCONSTRAINED
      |    BFILE
      |    BLOB
      |    CLOB
      |    NCLOB
      |    MLSLABEL
      ;
  
  bind_variable
      :    ( BINDVAR | ':' UNSIGNED_INTEGER)
           ( INDICATOR? (BINDVAR | ':' UNSIGNED_INTEGER))?
           ('.' general_element_part)*
      ;
  
  general_element
      :    general_element_part ('.' general_element_part)*
      ;
  
  general_element_part
      :    (INTRODUCER char_set_name)? id_expression
              ('.' id_expression)* function_argument?
      ;
  
  table_element
      :    (INTRODUCER char_set_name)? id_expression ('.' id_expression)*
      ;
  
  // $>
  
negative.code:     ;
      
  over_clause
      : OVER '(' query_partition_clause? (order_by_clause windowing_clause?)? ')'
      ;
  
  windowing_clause
      : windowing_type
        (BETWEEN windowing_elements AND windowing_elements | windowing_elements)
      ;
  
  windowing_type
      : ROWS
      | RANGE
      ;
  
  windowing_elements
      : UNBOUNDED PRECEDING
      | CURRENT ROW
      | concatenation_wrapper (PRECEDING|FOLLOWING)
      ;
  
  using_clause
      : USING ('*' | using_element (',' using_element)*)
      ;
  
  using_element
      : (IN OUT? | OUT)? select_list_elements column_alias?
      ;
  
  collect_order_by_part
      : ORDER BY concatenation_wrapper
      ;
  
  within_or_over_part
      : WITHIN GROUP '(' order_by_clause ')'
      | over_clause
      ;
  
  cost_matrix_clause
      : COST (MODEL AUTO? | '(' cost_class_name (',' cost_class_name)* ')' VALUES expression_list)
      ;
  
  xml_passing_clause
      : PASSING (BY VALUE)? expression_wrapper column_alias? (',' expression_wrapper column_alias?)
      ;
  
  xml_attributes_clause
      : XMLATTRIBUTES
       '(' (ENTITYESCAPING | NOENTITYESCAPING)? (SCHEMACHECK | NOSCHEMACHECK)?
       xml_multiuse_expression_element (',' xml_multiuse_expression_element)* ')'
      ;
  
  xml_namespaces_clause
      : XMLNAMESPACES
        '(' (concatenation_wrapper column_alias)? (',' concatenation_wrapper column_alias)*
        xml_general_default_part? ')'
      ;
  
  xml_table_column
      : xml_column_name
        (FOR ORDINALITY | type_spec (PATH concatenation_wrapper)? xml_general_default_part?)
      ;
  
  xml_general_default_part
      : DEFAULT concatenation_wrapper
      ;
  
  xml_multiuse_expression_element
      : expression (AS (id_expression | EVALNAME concatenation))?
      ;
  
  xmlroot_param_version_part
      : VERSION (NO VALUE | expression_wrapper)
      ;
  
  xmlroot_param_standalone_part
      : STANDALONE (YES | NO VALUE?)
      ;
  
  xmlserialize_param_enconding_part
      : ENCODING concatenation_wrapper
      ;
  
  xmlserialize_param_version_part
      : VERSION concatenation_wrapper
      ;
  
  xmlserialize_param_ident_part
      : NO INDENT
      | INDENT (SIZE '=' concatenation_wrapper)?
      ;
      
  // SqlPlus
  
  sql_plus_command 
      : ('/' | whenever_command | exit_command | prompt_command | set_command) ';'?
      ;
  
  whenever_command
      : WHENEVER (SQLERROR | OSERROR)
        (EXIT (SUCCESS | FAILURE | WARNING) (COMMIT | ROLLBACK) | CONTINUE (COMMIT|ROLLBACK|NONE))
      ;
  
  set_command
      : SET regular_id (CHAR_STRING | ON | OFF | /*EXACT_NUM_LIT*/numeric | regular_id) // TODO
      ;
  
  exit_command
      : EXIT 
      ;
  
  prompt_command
      : PROMPT
      ;
  
  // Common
  
  partition_extension_clause
      : (SUBPARTITION | PARTITION) FOR? expression_list
      ;
  
  column_alias
      : AS? (id | alias_quoted_string)
      | AS
      ;
  
  table_alias
      : (id | alias_quoted_string)
      ;
  
  alias_quoted_string
      : quoted_string
      ;
  
  where_clause
      : WHERE (current_of_clause | condition_wrapper)
      ;
  
  current_of_clause
      : CURRENT OF cursor_name
      ;
  
  into_clause
      : INTO variable_name (',' variable_name)* 
      | BULK COLLECT INTO variable_name (',' variable_name)* 
      ;
  
  // $>
  