anchor.diff:        )
       ;
   
  -indexExpression returns [IndexOperator operator, ElementOrRange elementOrRange]
  -    : elementSelectionOperator 
  -      { $operator=$elementSelectionOperator.operator; }
  -      indexOrIndexRange 
  -      { $elementOrRange=$indexOrIndexRange.elementOrRange; }
  -      RBRACKET
  -    ;
  -
   memberSelectionOperator returns [MemberOperator operator]
       : MEMBER_OP
         { $operator=new MemberOp($MEMBER_OP); }
  
positive.code:     )
      ;
  
  indexOrIndexRange returns [ElementOrRange elementOrRange]
      : l=index
      (
        { Element e = new Element(null);
          $elementOrRange = e;
          e.setExpression($l.expression); }
        | '...' 
        { ElementRange er1 = new ElementRange(null);
          $elementOrRange = er1;
          er1.setLowerBound($l.expression); }
        | '..' u=index 
        { ElementRange er2 = new ElementRange(null);
          $elementOrRange = er2;
          er2.setLowerBound($l.expression); 
          er2.setUpperBound($u.expression); }
        | ':' s=index 
        { ElementRange er3 = new ElementRange(null);
          $elementOrRange = er3;
          er3.setLowerBound($l.expression); 
          er3.setLength($s.expression); }
      )
      ;
  
  index returns [Expression expression]
  
negative.code:           if ($arguments.argumentList instanceof NamedArgumentList)
                ie.setNamedArgumentList((NamedArgumentList)$arguments.argumentList);
            $primary=ie; }
        | indexOrIndexRange 
          { $indexOrIndexRange.indexExpression.setPrimary($primary);
            $primary = $indexOrIndexRange.indexExpression; }
      )*
      ;
  
  