public MethodNode parseMethodNode()  throws ParserException, IOException, LexerException {
		Token token = this.nextToken();
		
		if (token == null)
			return null;

		if (token.getType() == TokenType.ID) {
			String selector = token.getValue();
			String[] locals = this.parseLocalNames();
			Node expr = this.parseExpressionNode();
			return new MethodNode(selector, null, locals, expr);
		}
		
		if (token.getType() == TokenType.BINSELECTOR) {
			String selector = token.getValue();
			String[] arguments = new String[] { this.parseId() };
			String[] locals = this.parseLocalNames();
			Node expr = this.parseExpressionNode();
			return new MethodNode(selector, arguments, locals, expr);
		}
		
		if (token.getType() == TokenType.KEYSELECTOR) {
			String selector = token.getValue();
			List<String> ids = new ArrayList<String>();
			ids.add(this.parseId());
			
			for (token = this.nextToken(); token != null && token.getType() == TokenType.KEYSELECTOR; token = this.nextToken()) {
				selector += token.getValue();
				ids.add(this.parseId());
			}
			
			this.pushToken(token);
			
			String[] arguments = new String[ids.size()];
			arguments = ids.toArray(arguments);
			String[] locals = this.parseLocalNames();
			Node expr = this.parseExpressionNode();
			return new MethodNode(selector, arguments, locals, expr);
		}
		
		throw new ParserException("Unexpected '" + token.getValue() + "'");
	}