anchor.diff:      ;
   
   forFail
  -    : 'for' '(' forIterator ')' loopBlock=block ('fail' failBlock=block)?
  -    -> ^(FOR_STMT forIterator ^(LOOP_BLOCK $loopBlock) ^(FAIL_BLOCK $failBlock)?)
  +    : forBlock failBlock?
  +    -> ^(FOR_STMT forBlock failBlock?)
  +    ;
  +
  +forBlock
  +    : 'for' '(' forIterator ')' block
  +    -> forIterator ^(LOOP_BLOCK block)
  +    ;
  +
  +failBlock
  +    : 'fail' block
  +    -> ^(FAIL_BLOCK block)
       ;
   
   forIterator
  -    : v1=variable ('->' v2=variable)? containment
  -    -> ^(FOR_ITERATOR $v1 $v2? containment)
  +    : variable ('->' variable)? containment
  +    -> ^(FOR_ITERATOR variable+ containment)
       ;
       
   containment
  
positive.code:     ;
      
  doWhile
      : ('do' ('(' doIterator ')')? b1=block? )?  
        'while' '(' condition ')' (b2=block | ';')
      -> ^(WHILE_STMT ^(CONDITION condition) ^(DO_ITERATOR doIterator)? ^(DO_BLOCK $b1)?
         ^(WHILE_BLOCK $b2)?)
      ;
  
  //do iterators are allowed to be mutable and/or optional
  
negative.code:     ;
      
  ifElse
      : ifBlock elseBlock?
      -> ^(IF_STMT ifBlock elseBlock?)
      ;
  
  ifBlock
      : 'if' '(' condition ')' block
      -> ^(CONDITION condition) ^(IF_TRUE block)
      ;
  
  elseBlock
      : 'else' (ifElse | block)
      -> ^(IF_FALSE block? ifElse?)
      ;
  
  switchCaseElse
      : switchHeader ( '{' cases '}' | cases )
      -> ^(SWITCH_STMT switchHeader cases)
      ;
  
  switchHeader
      : 'switch' '(' expression ')'
      -> ^(SWITCH_EXPR expression)
      ;
  
  cases 
      : caseItem+ defaultCaseItem?
      -> ^(SWITCH_CASE_LIST caseItem+ defaultCaseItem?)
      ;
      
  caseItem
  