anchor.diff:      : ALTER PROCEDURE procedure_name COMPILE DEBUG? compiler_parameters_clause* (REUSE SETTINGS)? ';'
       ;
   
  +function_body
  +    : FUNCTION function_name ('(' parameter (',' parameter)* ')')?
  +      RETURN type_spec (invoker_rights_clause|parallel_enable_clause|result_cache_clause|DETERMINISTIC)*
  +      ((PIPELINED? (IS | AS) (DECLARE? declare_spec* body | call_spec)) | (PIPELINED | AGGREGATE) USING implementation_type_name) ';'
  +    ;
  +
  +procedure_body
  +    : PROCEDURE procedure_name ('(' parameter (',' parameter)* ')')? 
  +      (IS | AS)
  +      (DECLARE? declare_spec* body | call_spec | EXTERNAL) ';'
  +    ;
  +
   create_procedure_body
  -    : (CREATE (OR REPLACE)?)? PROCEDURE procedure_name ('(' parameter (',' parameter)* ')')? 
  +    : CREATE (OR REPLACE)? PROCEDURE procedure_name ('(' parameter (',' parameter)* ')')? 
         invoker_rights_clause? (IS | AS)
         (DECLARE? declare_spec* body | call_spec | EXTERNAL) ';'
       ;
  
positive.code:     ;
  
  create_function_body
      : (CREATE (OR REPLACE)?)? FUNCTION function_name ('(' parameter (',' parameter)* ')')?
        RETURN type_spec (invoker_rights_clause|parallel_enable_clause|result_cache_clause|DETERMINISTIC)*
        ((PIPELINED? (IS | AS) (DECLARE? declare_spec* body | call_spec)) | (PIPELINED | AGGREGATE) USING implementation_type_name) ';'
      ;
  
negative.code: fragment W: [wW];
  fragment X: [xX];
  fragment Y: [yY];
  fragment Z: [zZ];