private Statement statement() {
		// skip any semicolons
		if(currentToken.type() == Token.Type.Semicolon)
			return new Skip();
		
		// if statement
		else if(currentToken.type() == Token.Type.If)
			return ifStatement();
		
		// while loop
		else if(currentToken.type() == Token.Type.While)
			return whileStatement();
		
		// identifier means assignment
		else if(currentToken.type() == Token.Type.Identifier){
			Variable name = new Variable(currentToken.value());
			match(Token.Type.Identifier);
			
			if(currentToken.type() == Token.Type.Assign)
				return assignment(name);
			else if(currentToken.type() == Token.Type.LeftParen){
				Call c = callStatement(name);
				match(Token.Type.Semicolon);
				return c;
			}
		
		// left brace indicates start of block
		} else if(currentToken.type() == Token.Type.LeftBrace){
			match(Token.Type.LeftBrace);
			Block bl = statements();
			match(Token.Type.RightBrace);
			return bl;
		
			
		} else if(currentToken.type() == Token.Type.Return){
			return returnStatement(currentFunction);
			
		// unkown statement type
		} else
			error("Unknown statement type: " + currentToken.value());
		
		return null;
	}