public IEvaluableToken parse() {

		try {
			// 1. Extract all parentheses into TokenLists
			extractParentheses();

			// 2. Convert operator tokens to operators, including their arguments
			//    in the correct order ^ * / + -
			extractOperator(TokenOperatorFactorial.class);
			extractOperator(TokenOperatorPower.class);
			extractOperator(TokenOperatorMultiply.class);
			extractOperator(TokenOperatorDivide.class);
			extractOperator(TokenOperatorModulo.class);
			extractOperator(TokenOperatorAdd.class);
			extractOperator(TokenOperatorSubtract.class);

			// 3. Check for leftovers, throw error if any
			if (this.size() > 1) {
				throw new ParseError("TokenList didn't parse entirely, probably a syntax error: " + this);
			}

			// 4. If last token is a TokenList, use its content instead
			if (this.get(0) instanceof TokenList) {
				TokenList theList = (TokenList) this.get(0);
				if (theList.size() == 1 && (theList.get(0) instanceof IEvaluableToken)) {
					IEvaluableToken eval = (IEvaluableToken) theList.get(0);
					this.clear();
					this.add(eval);
				}
			}

			// 5. Throw error if last token remaining is not evaluable
			if (!(this.get(0) instanceof IEvaluableToken)) {
				throw new ParseError("Last token in a TokenList is not evaluable: " + this.get(0));
			}

		} catch (ParseError e) {
			throw e;
		} catch (IndexOutOfBoundsException e) {
			throw new ParseError("Missing operand(s).");
		} catch (Exception e) {
			throw new ParseError(e);
		}

		return (IEvaluableToken) this.get(0); // checked earlier
	}