anchor.diff:  		}
   	;
   
  +typeNameWithVoid returns [TypeSymbol type]
  +	: typeName {$type = $typeName.type;}
  +	| Void {$type = TypeSymbol.toVoid($Void);}
  +	;
  +
   paramTypes returns [TypeSymbol[] types] locals [ParserUtils.ParamTypeResolver resolver]
  -	: comma lBracket a+=typeNameWithoutVoid (comma a+=typeNameWithoutVoid)* rBracket
  +	: comma lBracket a+=typeName (comma a+=typeName)* rBracket
   		{
   			$resolver = new ParserUtils.ParamTypeResolver();
   			for(int i = 0; i < $a.size(); i++) {
  
positive.code: 	;
  
  argumentDeclarationWithType returns [ParserUtils.ArgDecl arg]
  	: Identifier colon typeNameWithoutVoid {$arg = new ParserUtils.ArgDecl($Identifier, $typeNameWithoutVoid.type);}
  	;
  
  typeName returns [TypeSymbol type] locals [TypeSymbol[] types]
  	: typeNameWithoutVoid {$type = $typeNameWithoutVoid.type;}
  	| Void {$type = TypeSymbol.toVoid($Void);}
  	;
  
  typeNameWithoutVoid returns [TypeSymbol type] locals [TypeSymbol[] types]
  	: Int {$type = TypeSymbol.toPrimitive($Int);}
  	| Float {$type = TypeSymbol.toPrimitive($Float);}
  	| Boolean {$type = TypeSymbol.toPrimitive($Boolean);}
  	| Identifier {$type = TypeSymbol.toClass($Identifier);}
  	| Func lAngle aa=typeName paramTypes rAngle
  		{$type = TypeSymbol.toFunc($Func, $aa.type, $paramTypes.types);}
  	| Identifier lAngle a+=typeNameWithoutVoid (comma a+=typeNameWithoutVoid)* rAngle
  		{
  			$types = new TypeSymbol[$a.size()];
  			for(int i = 0; i < $types.length; i++) {
  
negative.code: 	;
  
  returnType returns [TypeSymbol type]
  	: colon typeNameWithVoid {$type = $typeNameWithVoid.type;}
  	| { $type = TypeSymbol.toVoid(); }
  	;
  
  