private Statement statement() throws RequiredTokenException 
	{
		enterRule(NonTerminal.STATEMENT);
		Statement statement = null;
		if(firstSetSatisfied(NonTerminal.VARIABLE_DECLARATION))
			try 
			{
				statement = variable_declaration();
			} 
			catch (SymbolRedefinitionException e) 
			{
				statement = new Error(
					e.DuplicateToken.getLineNumber(),
					e.DuplicateToken.getCharPos(),
					String.format("Attempted to redefine symbol \"%s\".", e.DuplicateToken.getLexeme()));
			}
		else if(firstSetSatisfied(NonTerminal.CALL_STATEMENT))
			try 
			{
				statement = call_statement();
			} 
			catch (UnresolvableSymbolException e) 
			{
				statement = new Error(
					e.UnresolvedToken.getLineNumber(),
					e.UnresolvedToken.getCharPos(),
					String.format("Unable to resolve symbol \"%s\".", e.UnresolvedToken.getLexeme()));
			}
		else if(firstSetSatisfied(NonTerminal.ASSIGNMENT_STATEMENT))
			statement = assignment_statement();
		else if(firstSetSatisfied(NonTerminal.IF_STATEMENT))
			statement = if_statement();
		else if(firstSetSatisfied(NonTerminal.WHILE_STATEMENT))
			statement = while_statement();
		else if(firstSetSatisfied(NonTerminal.RETURN_STATEMENT))
			statement = return_statement();
		else
		{
			statement = new Error(
				reader.token().getLineNumber(), 
				reader.token().getCharPos(),
				String.format("First set unsatisfied for non-terminal of kind \"%s\".", reader.token().getKind()));
		}
		exitRule();
		return statement;
	}