anchor.diff:      mapping_option
     | mapping_option map_list
   ;
  -
  +*/
   
   /*----------------------------------------------------------------------------
    * LEXER RULES
  
positive.code: ;
  
  
  ids_list returns [List<String> ids]
    @init{
      $ids = new ArrayList();
    }
    :
      i=IDENTIFIER { $ids.add($i.text); }
    | i=IDENTIFIER { $ids.add($i.text); } ',' ids_list
  ;
  
  
  directive[ClawLanguage language]:
      LFUSION { $language.setDirective(ClawDirective.LOOP_FUSION); } group_option[$language]
    | LINTERCHANGE { $language.setDirective(ClawDirective.LOOP_INTERCHANGE); } '(' ids_list ')'
    | LEXTRACT { $language.setDirective(ClawDirective.LOOP_EXTRACT); } range_option
    | REMOVE { $language.setDirective(ClawDirective.REMOVE); }
    | END REMOVE { $language.setDirective(ClawDirective.END_REMOVE); }
  ;
  
  group_option[ClawLanguage language]:
  
negative.code:   | /* empty */
  ;
  
  indexes_option[ClawLanguage language]
    @init{
      List<String> indexes = new ArrayList();
    }
    :
      '(' ids_list[indexes] ')' { $language.setIdList(indexes); }
    | /* empty */
  ;
  
  range_option:
      RANGE '(' induction=IDENTIFIER '=' ',' lower=IDENTIFIER ',' upper=IDENTIFIER ')'
    | RANGE '(' induction=IDENTIFIER '=' ',' lower=IDENTIFIER ',' upper=IDENTIFIER ',' step=IDENTIFIER ')'
  ;
  /*
  mapping_option:
      MAP '(' ids_list ':' ids_list ')'
  ;
  