anchor.diff:     | ('down' '(' expression ')')
      ;
   
  +invocation
  +   : primary '(' expression (',' expression)* ')'
  +   ;
  +
  +field
  +   : name (',' name)* ':' expression
  +   ;
  +
   idn
      : STRING
      ;
  
positive.code:    ;
  
  int_literal
     : NUMBER
     ;
  
  real_literal
     : NUMBER
     ;
  
  string_literal
     : NUMBER
     ;
  
  comment
     : COMMENT
     ;
  
  
  
negative.code:    : name (',' name)* type_spec
     ;
  
  statement
     : decl
     | (idn ':' type_spec ':=' expression)
     | (decl (',' decl)* ':=' invocation)
     | (idn (',' idn)* ':=' invocation)
     | (idn (',' idn)* ':=' expression (',' expression)*)
     | (primary '.' name ':=' expression)
     | invocation
     | ('while' expression 'do' body 'end')
     | ('for' (decl (',' decl)*)? 'in' invocation 'do' body 'end')
     | ('for' (idn (',' idn)*)? 'in' invocation 'do' body 'end')
     | ('if' expression 'then' body ('elseif' expression 'then' body)* ('else' body)? 'end')
     | ('tagcase' expression tag_arm* ('others' ':' body)? 'end')
     | ('return' (expression (',' expression)*)?)
     | ('yeild' (expression (',' expression)*)?)
     | ('signal' name (expression (',' expression)*)?)
     | ('exit' name (expression (',' expression)*)?)
     | 'break'
     | 'continue'
     | ('begin' body 'end')
     | (statement 'resignal' name (',' name)*)
     | (statement 'except' when_handler* others_handler? 'end')
     ;
  
  tag_arm
     : 'tag' name (',' name)* ('(' idn ':' type_spec ')')? ':' body
     ;
  