anchor.diff:    | UPDATE '(' OUT ')'
       { $l.setUpdateClauseValue(ClawDMD.OUT); }
   ;
  +
  +target_clause[ClawLanguage l]
  +  @init{
  +    List<Target> targets = new ArrayList<>();
  +  }
  +  :
  +    TARGET '(' target_list[targets] ')'
  +    { $l.setTargetClauseValue(targets); }
  +;
  +
  +target_list[List<Target> targets]:
  +    target { if(!$targets.contains($target.t)) { $targets.add($target.t); } }
  +  | target { if(!$targets.contains($target.t)) { $targets.add($target.t); } } ',' target_list[$targets]
  +;
  +
  +
  +target returns [Target t]:
  +    CPU { $t = Target.CPU; }
  +  | GPU { $t = Target.GPU; }
  +  | MIC { $t = Target.MIC; }
  +;
  +
  +
  +loop_fusion_clauses[ClawLanguage l]:
  +  (
  +    { !$l.hasGroupClause() }?    group_clause[$l]
  +  | { !$l.hasCollapseClause() }? collapse_clause[$l]
  +  | { !$l.hasTargetClause() }?   target_clause[$l]
  +  )*
  +;
  +
  +
   
   /*----------------------------------------------------------------------------
    * LEXER RULES
  
positive.code: ;
  
  // group clause
  group_clause_optional[ClawLanguage l]:
      GROUP '(' group_name=IDENTIFIER ')'
      { $l.setGroupClause($group_name.text); }
    | /* empty */
  ;
  
  // collapse clause
  collapse_clause_optional[ClawLanguage l]:
      COLLAPSE '(' n=NUMBER ')'
      { $l.setCollapseClause($n.text); }
    | /* empty */
  ;
  
  // fusion clause
  fusion_clause_optional[ClawLanguage l]:
      FUSION group_clause_optional[$l] { $l.setFusionClause(); }
    | /* empty */
  ;
  
  
negative.code: import cx2x.translator.common.ClawConstant;
  import cx2x.translator.language.base.*;
  import cx2x.translator.language.common.*;
  import cx2x.translator.language.helper.target.Target;
  import cx2x.translator.common.Utility;
  }
  
  