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;
}