anchor.diff:  ;
   
   directive[ClawLanguage language]:
  +  // loop-fusion directive
       LFUSION { $language.setDirective(ClawDirective.LOOP_FUSION); } group_option[$language] EOF
  +  // loop-interchange directive
     | LINTERCHANGE { $language.setDirective(ClawDirective.LOOP_INTERCHANGE); } indexes_option[$language] EOF
  -  | LEXTRACT range_option EOF
  +  // loop-extract directive
  +  | LEXTRACT range_option mapping_option EOF
       {
         $language.setDirective(ClawDirective.LOOP_EXTRACT);
         $language.setRange($range_option.r);
       }
  +  // remove directive
     | REMOVE { $language.setDirective(ClawDirective.REMOVE); } EOF
     | END REMOVE { $language.setDirective(ClawDirective.END_REMOVE); } EOF
   ;
  
positive.code:     }
  ;
  
  mapping_var returns [ClawMappingVar mappingVar]:
      lhs=IDENTIFIER '/' rhs=IDENTIFIER
      {
        $mappingVar = new ClawMappingVar($lhs.text, $rhs.text);
      }
    | i=IDENTIFIER { $mappingVar = new ClawMappingVar($i.text, $i.text); }
  ;
  
  mapping_var_list[List<ClawMappingVar> vars]:
       mv=mapping_var { $vars.add($mv.mappingVar); }
  
negative.code:     '(' ids_list[indexes] ')' { $language.setIndexes(indexes); }
    | /* empty */
  ;
  
  
  range_option returns [ClawRange r]
    @init{
  