anchor.diff:          {$e = new MethodReferenceExpression($id.getText());}
   	;
   
  -// TODO
   methodReference_lfno_primary returns [MethodReferenceExpression e]
  +    locals [MethodReferenceExpression ref;]
   	:	en = expressionName '::' t = typeArguments? id = Identifier
  -        {$e = new MethodReferenceExpression($en, $id.getText());}
  +        {$e = new MethodReferenceExpression($en, $id.getText(), $t);}
   	|	r = referenceType '::' t = typeArguments? id = Identifier
  -        {$e = new MethodReferenceExpression($r, $id.getText());}
  +        {$e = new MethodReferenceExpression($r, $id.getText(), $t);}
   	|	'super' '::' t = typeArguments? id = Identifier
  -        {$e = new MethodReferenceExpression(Expression.SuperExpression,
  -                                            $id.getText());}
  +        {$e = new MethodReferenceExpression(new SuperLiteral(),
  +                                            $id.getText(),
  +                                            $t);}
   	|	tn = typeName '.' 'super' '::' t = typeArguments? id = Identifier
  -        {$e = new MethodReferenceExpression($tn, $id.getText());}
  +        {
  +            $ref = new MethodReferenceExpression(new SuperLiteral(),
  +                                                 $id.getText(),
  +                                                 $t);
  +            $e = new AccessExpression(new TypeExpression($tn), $ref);
  +        }
   	|	c = classType '::' t = typeArguments? 'new'
  -        {$e = new MethodReferenceExpression($c);}
  +        {$e = new MethodReferenceExpression(new TypeExpression($c), "new", $t);}
   	|	a = arrayType '::' 'new'
  -        {$e = new MethodReferenceExpression($a);}
  -	;
  -
  -// TODO
  -arrayCreationExpression returns [Expression e]
  -	:	'new' primitiveType dimExprs dims?
  -	|	'new' classOrInterfaceType dimExprs dims?
  -	|	'new' primitiveType dims arrayInitializer
  -	|	'new' classOrInterfaceType dims arrayInitializer
  -	;
  -
  -// TODO
  -dimExprs
  -	:	dimExpr dimExpr*
  -	;
  -
  -// TODO
  -dimExpr returns [Expression e]
  -    locals [List<Modifier> mods = new ArrayList<>();]
  -	:	(a = annotation {$mods.add($a);})*
  +        {$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]
  
positive.code: 	|	'strictfp' {$m = Modifier.STRICT_FP;}
  	;
  
  // TODO
  annotationTypeDeclaration
      locals [List<Modifier> mods = new ArrayList<>();]
      :	(m = interfaceModifier {$mods.add($m);})*
  		'@' 'interface' id = Identifier b = annotationTypeBody
  	;
  
  // TODO
  annotationTypeBody
  	:	'{' annotationTypeMemberDeclaration* '}'
  	;
  
  // TODO
  annotationTypeMemberDeclaration
  	:	annotationTypeElementDeclaration
  	|	constantDeclaration
  	|	classDeclaration
  	|	interfaceDeclaration
  	|	';'
  	;
  
  // TODO
  annotationTypeElementDeclaration
      locals [List<Modifier> mods = new ArrayList<>();]
  	:	(m = annotationTypeElementModifier {$mods.add($m);})*
          t = unannType id = Identifier '(' ')'
          ds = dims?
          dv = defaultValue? ';'
  	;
  
  // TODO
  annotationTypeElementModifier returns [Modifier m]
  	:	a = annotation {$m = $a;}
  	|	'public' {$m = Modifier.PUBLIC;}
  
negative.code: 	|	'private' {$m = Modifier.PRIVATE;}
  	;
  
  constructorDeclarator [MethodDeclaration d]
  	:	t = typeParameters? n = simpleTypeName '(' l = formalParameterList? ')'
          {
  