Expression parse(String inputString)

Parses the given input string into an Expression. Throws a ArgumentError if the given inputString is empty. Throws a StateError if the token stream is invalid. Returns a valid Expression.

Source

Expression parse(String inputString) {
  if (inputString == null || inputString.trim().isEmpty) {
    throw new ArgumentError("The given input string was empty.");
  }

  List<Expression> exprStack = new List<Expression>();
  List<Token> inputStream = lex.tokenizeToRPN(inputString);

  for (Token currToken in inputStream){
    Expression currExpr, left, right;

    switch(currToken.type) {
      case TokenType.VAL:
        currExpr = new Number(double.parse(currToken.text));
        break;
      case TokenType.VAR:
        currExpr = new Variable(currToken.text);
        break;
      case TokenType.UNMINUS:
        currExpr = -exprStack.removeLast();
        break;
      case TokenType.PLUS:
        right = exprStack.removeLast();
        left = exprStack.removeLast();
        currExpr = left + right;
        break;
      case TokenType.MINUS:
        right = exprStack.removeLast();
        left = exprStack.removeLast();
        currExpr = left - right;
        break;
      case TokenType.TIMES:
        right = exprStack.removeLast();
        left = exprStack.removeLast();
        currExpr = left * right;
        break;
      case TokenType.DIV:
        right = exprStack.removeLast();
        left = exprStack.removeLast();
        currExpr = left / right;
        break;
      case TokenType.POW:
        right = exprStack.removeLast();
        left = exprStack.removeLast();
        currExpr = left ^ right;
        break;
      case TokenType.EFUNC:
        currExpr = new Exponential(exprStack.removeLast());
        break;
      case TokenType.LOG:
        right = exprStack.removeLast();
        left = exprStack.removeLast();
        currExpr = new Log(left, right);
        break;
      case TokenType.LN:
        currExpr = new Ln(exprStack.removeLast());
        break;
      case TokenType.SQRT:
        currExpr = new Sqrt(exprStack.removeLast());
        break;
      case TokenType.ROOT:
        right = exprStack.removeLast();
        left = exprStack.removeLast();
        currExpr = new Root.fromExpr((left as Number), right);
        break;
      case TokenType.SIN:
        currExpr = new Sin(exprStack.removeLast());
        break;
      case TokenType.COS:
        currExpr = new Cos(exprStack.removeLast());
        break;
      case TokenType.TAN:
        currExpr = new Tan(exprStack.removeLast());
        break;
      case TokenType.ABS:
        currExpr = new Abs(exprStack.removeLast());
        break;
      case TokenType.SGN:
        currExpr = new Sgn(exprStack.removeLast());
        break;
      default: throw new ArgumentError('Unsupported token: $currToken');
    }

    exprStack.add(currExpr);
  }

  if(exprStack.length > 1) {
    throw new StateError("The input String is not a correct expression");
  }

  return exprStack.last;
}