anchor.diff:      }
   
     // Kcache directive
  -  | KCACHE data_clause[$l] offset_list_optional[i] private_optional[$l] EOF
  +  | KCACHE data_clause[$l] kcache_clauses[$l] EOF
       {
         $l.setDirective(ClawDirective.KCACHE);
  -      $l.setOffsets(i);
  -    }
  -  | KCACHE data_clause[$l] offset_list_optional[i] INIT private_optional[$l] EOF
  -    {
  -      $l.setDirective(ClawDirective.KCACHE);
  -      $l.setOffsets(i);
  -      $l.setInitClause();
       }
   
     // Array notation transformation directive
  -  | ARRAY_TRANS induction_optional[$l] fusion_clause_optional[$l] parallel_clause_optional[$l] acc_optional[$l] EOF
  +  | ARRAY_TRANS array_transform_clauses[$l] EOF
       {  $l.setDirective(ClawDirective.ARRAY_TRANSFORM); }
     | END ARRAY_TRANS
       {
  
positive.code:   | MIC { $t = Target.MIC; }
  ;
  
  
  loop_fusion_clauses[ClawLanguage l]:
    (
      { !$l.hasGroupClause() }?    group_clause[$l]
  
negative.code:   )*
  ;
  
  // Possible permutation of clauses for the loop-interchange directive
  loop_interchange_clauses[ClawLanguage l]:
    (
      { !$l.hasParallelClause() }?    parallel_clause[$l]
    | { !$l.hasAcceleratorClause() }? acc_clause[$l]
    )*
  ;
  
  // Possible permutation of clauses for the loop-extract directive
  loop_extract_clauses[ClawLanguage l]:
    (
        { !$l.hasFusionClause() }?      fusion_clause[$l]
      | { !$l.hasParallelClause() }?    parallel_clause[$l]
      | { !$l.hasAcceleratorClause() }? acc_clause[$l]
    )*
  ;
  
  // Possible permutation of clauses for the array-transform directive
  array_transform_clauses[ClawLanguage l]:
    (
      { !$l.hasFusionClause() }?      fusion_clause[$l]
    | { !$l.hasParallelClause() }?    parallel_clause[$l]
    | { !$l.hasAcceleratorClause() }? acc_clause[$l]
    | { !$l.hasInductionClause() }?   induction_clause[$l]
    )*
  ;
  
  // Possible permutation of clauses for the kcache directive
  kcache_clauses[ClawLanguage l]
  @init{
      List<Integer> i = new ArrayList<>();
  }
  :
    (
      { $l.getOffsets() == null }? offset_clause[i] { $l.setOffsets(i); }
    | { !$l.hasInitClause() }?     INIT { $l.setInitClause(); }
    | { !$l.hasPrivateClause() }?  private_clause[$l]
    )*
  ;
  
  loop_hoist_clauses[ClawLanguage l]:
    (
      { !$l.hasReshapeClause() }? reshape_clause[$l]
    | { !$l.hasInterchangeClause() }? interchange_clause[$l]
    )*
  ;
  
  
  /*----------------------------------------------------------------------------
  