anchor.diff:  	|	a11 = methodReference {$e = $a11;}
   	;
   
  -// TODO
  +primaryNoNewArray_typeAccess returns [Expression e]
  +    locals [int cnt = 0,
  +            Type type]
  +	:	a2 = typeName
  +        ('[' ']' {++$cnt;})* '.' 'class'
  +        {
  +            $type = new ClassInterfaceType($a2);
  +            if ($cnt > 0) {
  +                $type = new ArrayType($type, $cnt);
  +            }
  +            $e = new AccessExpression(new TypeExpression($type),
  +                                      new ClassLiteral());
  +        }
  +	|	'void' '.' 'class'
  +        {$e = new AccessExpression(new VoidLiteral(), new ClassLiteral());}
  +	|	a5 = typeName '.' 'this'
  +        {$type = new TypeExpression(new ClassInterfaceType($a5));
  +         $e = new AccessExpression($type, new ThisLiteral());}
  +
   primaryNoNewArray_lf_arrayAccess
   	:
   	;
   
  -// TODO
   primaryNoNewArray_lfno_arrayAccess returns [Expression e]
   	:	a1 = literal {$e = $a1;}
  -	|	a2 = typeName ('[' ']')* '.' 'class'
  -	|	'void' '.' 'class'
  -	|	'this'
  -	|	a3 = typeName '.' 'this'
  +    |   a2 = primaryNoNewArray_typeAccess {$e = $a2;}
  +	|	'this' {$e = new ThisLiteral();}
  +        {$e = new AccessExpression($a3, new ThisLiteral());}
   	|	'(' p = expression ')' {$e = $p;}
   	|	a5 = classInstanceCreationExpression {$e = $a5;}
   	|   a6 = fieldAccess {$e = $a6;}
  
positive.code: 	|	a11 = methodReference_lfno_primary {$e = $a11;}
  	;
  
  // TODO
  primaryNoNewArray_lfno_primary_lf_arrayAccess_lfno_primary
  	:
  	;
  
  // TODO
  primaryNoNewArray_lfno_primary_lfno_arrayAccess_lfno_primary returns [Expression e]
  	:	a1 = literal {$e = $a1;}
  	|	a2 = typeName ('[' ']')* '.' 'class'
  	|	a3 = unannPrimitiveType ('[' ']')* '.' 'class'
  	|	'void' '.' 'class'
  	|	'this'
  	|	a6 = typeName '.' 'this'
  	|	'(' p = expression ')' {$e = $p;}
  	|	a7 = classInstanceCreationExpression_lfno_primary {$e = $a7;}
  	|	a8 = fieldAccess_lfno_primary {$e = $a8;}
  
negative.code:         {$e = new MethodReferenceExpression($id.getText());}
  	;
  
  methodReference_lfno_primary returns [MethodReferenceExpression e]
      locals [MethodReferenceExpression ref;]
  	:	en = expressionName '::' t = typeArguments? id = Identifier
          {$e = new MethodReferenceExpression($en, $id.getText(), $t);}
  	|	r = referenceType '::' t = typeArguments? id = Identifier
          {$e = new MethodReferenceExpression($r, $id.getText(), $t);}
  	|	'super' '::' t = typeArguments? id = Identifier
          {$e = new MethodReferenceExpression(new SuperLiteral(),
                                              $id.getText(),
                                              $t);}
  	|	tn = typeName '.' 'super' '::' t = typeArguments? id = Identifier
          {
              $ref = new MethodReferenceExpression(new SuperLiteral(),
                                                   $id.getText(),
                                                   $t);
              $e = new AccessExpression(new TypeExpression($tn), $ref);
          }
  	|	c = classType '::' t = typeArguments? 'new'
          {$e = new MethodReferenceExpression(new TypeExpression($c), "new", $t);}
  	|	a = arrayType '::' 'new'
          {$e = new MethodReferenceExpression(new TypeExpression($a), "new");}
  	;
  
  arrayCreationExpression returns [ArrayConstruction e]
  	:	'new' p = primitiveType de = dimExprs d = dims?
          {$e = new ArrayConstruction($p, $de, $d);}
  	|	'new' c = classOrInterfaceType de = dimExprs d = dims?
          {$e = new ArrayConstruction($c, $de, $d);}
  	|	'new' p = primitiveType d = dims i = arrayInitializer
          {$e = new ArrayConstruction($p, $d, $i);}
  	|	'new' c = classOrInterfaceType d = dims i = arrayInitializer
          {$e = new ArrayConstruction($c, $d, $i);}
  	;
  
  dimExprs returns [List<DimensionExpression> l]
  	:	d1 = dimExpr {$l = new ArrayList<>(); $l.add($d1);}
          (d = dimExpr {$l.add($d);})*
  	;
  
  dimExpr returns [DimensionExpression e]
      locals [List<Annotation> ans = new ArrayList<>();]
  	:	(a = annotation {$ans.add($a);})*
          '[' ex = expression ']'
          {$e = new DimensionExpression($ans, $ex);}
  	;
  
  constantExpression returns [Expression e]
  