anchor.diff:  	: CommandArg {$node = new Node.StringValueNode($CommandArg);}
   	;
   
  +// normal expression
   expression returns [Node.ExprNode node]
  -	: condOrExpression {$node = $condOrExpression.node;}
  -	;
  -
  -condOrExpression returns [Node.ExprNode node]
  -	: condAndExpression {$node = $condAndExpression.node;}
  -	| left=condOrExpression COND_OR right=condAndExpression
  -		{$node = new Node.CondOpNode($COND_OR, $left.node, $right.node);}
  -	;
  -
  -condAndExpression returns [Node.ExprNode node]
  -	: bitOrExpression {$node = $bitOrExpression.node;}
  -	| left=condAndExpression COND_AND right=bitOrExpression
  -		{$node = new Node.CondOpNode($COND_AND, $left.node, $right.node);}
  -	;
  -
  -bitOrExpression returns [Node.ExprNode node]
  -	: bitXorExpression {$node = $bitXorExpression.node;}
  -	| left=bitOrExpression OR right=bitXorExpression
  -		{$node = new Node.OperatorCallNode($OR, $left.node, $right.node);}
  -	;
  -
  -bitXorExpression returns [Node.ExprNode node]
  -	: bitAndExpression {$node = $bitAndExpression.node;}
  -	| left=bitXorExpression XOR right=bitAndExpression
  -		{$node = new Node.OperatorCallNode($XOR, $left.node, $right.node);}
  -	;
  -
  -bitAndExpression returns [Node.ExprNode node]
  -	: equalityExpression {$node = $equalityExpression.node;}
  -	| left=bitAndExpression AND right=equalityExpression
  -		{$node = new Node.OperatorCallNode($AND, $left.node, $right.node);}
  -	;
  -
  -equalityExpression returns [Node.ExprNode node]
  -	: instanceofExpression {$node = $instanceofExpression.node;}
  -	| left=equalityExpression op=(EQ | NE | REGEX_MATCH | REGEX_UNMATCH) right=instanceofExpression
  -		{$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  -	;
  -
  -instanceofExpression returns [Node.ExprNode node]
  -	: relationExpression {$node = $relationExpression.node;}
  -	| left=instanceofExpression Instanceof typeName
  -		{$node = new Node.InstanceofNode($Instanceof, $left.node, $typeName.type);}
  -	;
  -
  -relationExpression returns [Node.ExprNode node]
  -	: addExpression {$node = $addExpression.node;}
  -	| left=relationExpression op=(LT | LE | GT | GE) right=addExpression
  -		{$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  -	;
  -
  -addExpression returns [Node.ExprNode node]
  -	: mulExpression {$node = $mulExpression.node;}
  -	| left=addExpression op=(ADD | SUB) right=mulExpression
  -		{$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  -	;
  -
  -mulExpression returns [Node.ExprNode node]
  -	: unaryExpression {$node = $unaryExpression.node;}
  -	| left=mulExpression op=(MUL | DIV | MOD) right=unaryExpression
  -		{$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  -	;
  -
  -unaryExpression returns [Node.ExprNode node]
  -	: callExpression {$node = $callExpression.node;}
  -	| op=(ADD | SUB | BIT_NOT | NOT) right=unaryExpression
  -		{$node = new Node.OperatorCallNode($op, $right.node);}
  -	| '(' typeName ')' right=unaryExpression
  -		{$node = new Node.CastNode($typeName.type, $right.node);}
  -	;
  -
  -callExpression returns [Node.ExprNode node]
  -	: applyExpression {$node = $applyExpression.node;}
  -	| New typeName arguments 
  -		{$node = new Node.ConstructorCallNode($New, $typeName.type, $arguments.args);}
  -	;
  -
  -applyExpression returns [Node.ExprNode node]
   	: primaryExpression {$node = $primaryExpression.node;}
  -	| a=applyExpression arguments {$node = new Node.ApplyNode($a.node, $arguments.args);}
  -	| r=applyExpression '[' i=applyExpression ']' {$node = new Node.ElementGetterNode($r.node, $i.node);}
  -	| a=applyExpression '.' Identifier {$node = new Node.FieldGetterNode($a.node, $Identifier);}
  +	| a=expression arguments {$node = new Node.ApplyNode($a.node, $arguments.args);}
  +	| r=expression '[' i=expression ']' {$node = new Node.ElementGetterNode($r.node, $i.node);}
  +	| a=expression '.' Identifier {$node = new Node.FieldGetterNode($a.node, $Identifier);}
  +	| New typeName arguments {$node = new Node.ConstructorCallNode($New, $typeName.type, $arguments.args);}
  +	| '(' typeName ')' right=expression {$node = new Node.CastNode($typeName.type, $right.node);}
  +	| op=(ADD | SUB | BIT_NOT | NOT) right=expression {$node = new Node.OperatorCallNode($op, $right.node);}
  +	| left=expression op=(MUL | DIV | MOD) right=expression {$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  +	| left=expression op=(ADD | SUB) right=expression {$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  +	| left=expression op=(LT | LE | GT | GE) right=expression {$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  +	| left=expression Instanceof typeName {$node = new Node.InstanceofNode($Instanceof, $left.node, $typeName.type);}
  +	| left=expression op=(EQ | NE | REGEX_MATCH | REGEX_UNMATCH) right=expression {$node = new Node.OperatorCallNode($op, $left.node, $right.node);}
  +	| left=expression AND right=expression {$node = new Node.OperatorCallNode($AND, $left.node, $right.node);}
  +	| left=expression XOR right=expression {$node = new Node.OperatorCallNode($XOR, $left.node, $right.node);}
  +	| left=expression OR right=expression {$node = new Node.OperatorCallNode($OR, $left.node, $right.node);}
  +	| left=expression COND_AND right=expression {$node = new Node.CondOpNode($COND_AND, $left.node, $right.node);}
  +	| left=expression COND_OR right=expression {$node = new Node.CondOpNode($COND_OR, $left.node, $right.node);}
   	;
   
   primaryExpression returns [Node.ExprNode node]
  
positive.code: 			$node = $mapNode;
  		}
  	;
  mapEntry returns [ParserUtils.MapEntry entry]
  	: key=expression ':' value=expression {$entry = new ParserUtils.MapEntry($key.node, $value.node);}
  	;
  arguments returns [ParserUtils.Arguments args]
  	: '(' a+=argumentList? ')'
  		{
  
negative.code: 			$node = new Node.ClassNode($Class, $name, $superName, $classBody.body.getNodeList());
  		}
  	;
  
  classBody returns [ParserUtils.ClassBody body]
  	: '{' (a+=classElement statementEnd)+ '}'
  		{
  