private Declaration declaration() throws RequiredTokenException 
	{
		enterRule(NonTerminal.DECLARATION);
		Declaration declaration = null;
		try
		{
			if(firstSetSatisfied(NonTerminal.VARIABLE_DECLARATION))
				declaration = variable_declaration();
			else if(firstSetSatisfied(NonTerminal.ARRAY_DECLARATION))
				declaration = array_declaration();
			else if(firstSetSatisfied(NonTerminal.FUNCTION_DEFINITION))
				declaration = function_definition();
			else
			{
				declaration = new Error(
					reader.token().getLineNumber(), 
					reader.token().getCharPos(), 
					String.format("First sets unsatisfied by token of kind \"%s\".", reader.token().getKind()));
			}
		}
		catch(SymbolRedefinitionException e)
		{
			declaration = new Error(
				e.DuplicateToken.getLineNumber(),
				e.DuplicateToken.getCharPos(),
				String.format("Attempted to redefine symbol \"%s\".", e.DuplicateToken.getLexeme()));
		}
		exitRule();
		return declaration;
	}