anchor.diff:          {$e = new UnaryExpression($ex, UnaryOperator.PRE_DECREMENT);}
   	;
   
  -// TODO
   unaryExpressionNotPlusMinus returns [Expression e]
   	:	pf = postfixExpression {$e = $pf;}
   	|	'~' ex = unaryExpression
           {$e = new UnaryExpression($ex, UnaryOperator.BITWISE_NEGATION);}
   	|	'!' ex = unaryExpression
  -        {$e = new UnaryExpression($ex, UnaryOperator.NEGATIION);}
  +        {$e = new UnaryExpression($ex, UnaryOperator.NEGATION);}
   	|	cex = castExpression {$e = $cex;}
   	;
   
  -// TODO
  -postfixExpression returns [UnaryExpression e]
  -	:	(	p = primary
  -		|	n = expressionName
  +postfixExpression returns [Expression e]
  +	:	(	p = primary {$e = $p;}
  +		|	n = expressionName {$e = new IdentifierExpression($n);}
   		)
   		(	op1 = postIncrementExpression_lf_postfixExpression
  +            {$e = new UnaryExpression($e, $op1);}
   		|	op2 = postDecrementExpression_lf_postfixExpression
  +            {$e = new UnaryExpression($e, $op2);}
   		)*
   	;
   
  
positive.code:  */
  
  primary returns [Expression e]
  	:	(	pno = primaryNoNewArray_lfno_primary
  		|	a = arrayCreationExpression
  		)
  		(	p = primaryNoNewArray_lf_primary
  		)*
  	;
  
  // TODO
  primaryNoNewArray returns [Expression e]
  	:	a1 = literal {$e = $a1;}
  	|	a2 = typeName ('[' ']')* '.' 'class'
  	|	'void' '.' 'class'
  	|	'this'
  	|	a5 = typeName '.' 'this'
  	|	'(' p = expression ')' {$e = $p;}
  	|	a7 = classInstanceCreationExpression {$e = $a7;}
  	|	a8 = fieldAccess {$e = $a8;}
  
negative.code: 	|	a10 = methodReference_lfno_primary {$e = $a10;}
  	;
  
  classInstanceCreationExpression returns [Expression e]
      locals [Expression methodExpr,
              List<Annotation> ans = new ArrayList<>(),
              List<Annotation> ans2 = new ArrayList<>()]
  	:	'new' t = typeArguments? (a = annotation {$ans.add($a)})*
          id = Identifier
          {
              $methodExpr = new IdentifierExpression($id.getText(), $ans);
          }
          ('.' (a2 = annotation {$ans2.add($a2);})* id2 = Identifier
              {
                  $methodExpr = new AccessExpression($methodExpr,
                                                     new IdentifierExpression($id2.getText(),
                                                                              $ans2));
                  $ans2.clear();
              }
          )*
          targs = typeArgumentsOrDiamond?
          '(' l = argumentList? ')' b = classBody?
          {$e = new InstantionExpression($t, $methodExpr, $targs, $l, $b);}
  	|	name = expressionName '.' 'new' t = typeArguments?
          (a = annotation {$ans.add($a);})*
          id = Identifier targs = typeArgumentsOrDiamond?
          '(' l = argumentList? ')' b = classBody?
          {
              $e = new InstantiationExpression($t, $ans, $id.getText(),
                                               $targs, $l, $b);
              $e = new AccessExpression($name, $e);
          }
  	|	p = primary '.' 'new' t = typeArguments?
          (a = annotation {$ans.add($a);})*
          id = Identifier targs = typeArgumentsOrDiamond?
          '(' l = argumentList? ')' b = classBody?
          {
              $e = new InstantiationExpression($t, $ans, $id.getText(),
                                               $targs, $l, $b);
              $e = new AccessExpression($p, $e);
          }
  	;
  
  classInstanceCreationExpression_lf_primary returns [InstantiationExpression e]
      locals [List<Annotation> ans = new ArrayList<>();]
  	:	'.' 'new' t = typeArguments?
          (a = annotation {$ans.add($a);})*
          id = Identifier targs = typeArgumentsOrDiamond?
          '(' l = argumentList? ')'
          b = classBody?
          {$e = new InstantiationExpression($t, $ans, $id.getText(), $targs, $l, $b);}
  	;
  
  classInstanceCreationExpression_lfno_primary returns [InstantiationExpression e]
      locals [Expression methodExpr,
              List<Annotation> ans = new ArrayList<>(),
              List<Annotation> ans2 = new ArrayList<>()]
  	:	'new' t = typeArguments? (a = annotation {$ans.add($a)})*
          id = Identifier
          {
              $methodExpr = new IdentifierExpression($id.getText(), $ans);
          }
          ('.' (a2 = annotation {$ans2.add($a2);})* id2 = Identifier
              {
                  $methodExpr = new AccessExpression($methodExpr,
                                                     new IdentifierExpression($id2.getText(),
                                                                              $ans2));
                  $ans2.clear();
              }
          )*
          targs = typeArgumentsOrDiamond?
          '(' l = argumentList? ')' b = classBody?
          {$e = new InstantiationExpression($t, $methodExpr, $targs, $l, $b);}
  	|	name = expressionName '.' 'new' t = typeArguments?
          (a = annotation {$ans.add($a);})*
          id = Identifier targs = typeArgumentsOrDiamond?
          '(' l = argumentList? ')' b = classBody?
          {
              $e = new InstantiationExpression($t, $ans, $id.getText(),
                                               $targs, $l, $b);
              $e = new AccessExpression($name, $e);
          }
      ;
  
  typeArgumentsOrDiamond returns [List<TypeArgument> l]
  	:	ta = typeArguments {$l = $ta;}
  	|	'<' '>' {$l = new ArrayList<>(); $l.add(TypeArgument.DIAMOND);}
  	;
  
  fieldAccess returns [AccessExpression e]
  