public override object Process(TreeFunctional treeFunction) { MakeReversePolishNotation(); foreach (var token in reversePolishNotation) { switch (token.type) { case TokenType.NUMERIC_CONST: case TokenType.VARIABLE: stack.Push(token); break; case TokenType.PLUS: stack.Push(new TokenNumeric() { data = (double)((stack.Pop() as TokenNumeric).data) + (double)((stack.Pop() as TokenNumeric).data) }); break; case TokenType.MINUS: var right = (double)((stack.Pop() as TokenNumeric).data); var left = (double)((stack.Pop() as TokenNumeric).data); stack.Push(new TokenNumeric() { data = left - right }); break; case TokenType.MULTIPLICATION: stack.Push(new TokenNumeric() { data = (double)((stack.Pop() as TokenNumeric).data) * (double)((stack.Pop() as TokenNumeric).data) }); break; case TokenType.DIVIDE: right = (double)((stack.Pop() as TokenNumeric).data); left = (double)((stack.Pop() as TokenNumeric).data); stack.Push(new TokenNumeric() { data = left / right }); break; default: throw new Exception("something bad in get priority!"); } } object data = (stack.Pop() as TokenNumeric).data; if (tokenToChange != null && treeFunction != null) { treeFunction.UpdateVar(tokenToChange.name, data, VariableType.NUMERIC); } return(data); }
public override object Process(TreeFunctional treeFunction) { string str = ""; foreach (var token in strings) { str += (string)token.data; } if (treeFunction != null) { treeFunction.UpdateVar(tokenToChange.name, str, VariableType.STRING); } return(str); }