anchor.diff:    }
     :
       '(' ids_list[indexes] ')' { $l.setIndexes(indexes); }
  +  | /* empty */
  +;
  +
  +offset_list_optional[List<String> offsets]:
  +    offset_list[$offsets]
     | /* empty */
   ;
   
  
positive.code:   | END REMOVE { $l.setDirective(ClawDirective.END_REMOVE); } EOF
  
    // Kcache directive
    | KCACHE offset_list[o]
      {
        $l.setDirective(ClawDirective.KCACHE);
        $l.setOffsets(o);
  
negative.code:     $r = new ClawRange();
    }
    :
      RANGE '(' induction=IDENTIFIER '=' lower=range_id ',' upper=range_id ')'
      {
        $r.setInductionVar($induction.text);
        $r.setLowerBound($lower.text);
        $r.setUpperBound($upper.text);
        $r.setStep(Constant.DEFAULT_STEP_VALUE);
      }
    | RANGE '(' induction=IDENTIFIER '=' lower=range_id ',' upper=range_id ',' step=range_id ')'
      {
        $r.setInductionVar($induction.text);
        $r.setLowerBound($lower.text);
        $r.setUpperBound($upper.text);
        $r.setStep($step.text);
      }
  ;
  
  range_id returns [String text]:
      n=NUMBER { $text = $n.text; }
    | i=IDENTIFIER { $text = $i.text; }
  ;
  
  
  