public void ParseIt(string strForParsing) { scOp = new OperatorStack(); eqResult = new ExecutionQueue(); string strSrc = strForParsing; scOp.Clear(); int pos = 0; bool isFirstOperator = true; EnmOperators opCurrent; while(pos < strSrc.Length) { if((opCurrent = IsOperator(strSrc, isFirstOperator, ref pos)) != EnmOperators.Nop) { if(opCurrent != EnmOperators.Blank) { OperatorStackManager(opCurrent); if(opCurrent == EnmOperators.RightPar) isFirstOperator = false; else isFirstOperator = true; } continue; } eqResult.Enqueue(GetOperand(strSrc, ref pos)); isFirstOperator = false; } while(scOp.Count>0) { eqResult.Enqueue(new ExecutionItem(scOp.Pop())); } }
public new ExecutionQueue Clone() { ExecutionQueue retEQ = new ExecutionQueue(); IEnumerator ieNum = this.GetEnumerator(); while(ieNum.MoveNext()) retEQ.Enqueue((ExecutionItem)ieNum.Current); return retEQ; }
public Variant CalcIt(ExecutionQueue eq) { ExecutionItem ei; if(eq.Count == 0) return new Variant(""); while(eq.Count > 0) { ei = eq.Dequeue(); switch(ei.itemType) { case ItemType.itBool: if(String.Compare(ei.itemString,"True",true) == 0) calcStack.Push(new Variant(true)); else calcStack.Push(new Variant(false)); break; case ItemType.itString: calcStack.Push(new Variant(ei.itemString)); break; case ItemType.itDigit: try { int i = int.Parse(ei.itemString); calcStack.Push(new Variant(i)); } catch { double d; try {d = double.Parse(ei.itemString);} catch{throw(new CalcException("Bad digital format"));} calcStack.Push(new Variant(d)); } break; case ItemType.itDate: DateTime dt; try {dt = DateTime.Parse(ei.itemString);} catch {throw(new CalcException("Bad date format"));} calcStack.Push(new Variant(dt)); break; case ItemType.itOperator: DoOperator(ei.itemOperator,eq); break; case ItemType.itFunction: DoFunction(ei); break; case ItemType.itVariable: if(!Variables.ContainsKey(ei.itemString)) throw(new CalcException("Bad variable name !")); calcStack.Push(new Variant(Variables[ei.itemString])); break; default: throw(new CalcException("Bad item in execution queue")); } } return calcStack.Pop(); }
public new ExecutionQueue Clone() { ExecutionQueue retEQ = new ExecutionQueue(); IEnumerator ieNum = this.GetEnumerator(); while (ieNum.MoveNext()) { retEQ.Enqueue((ExecutionItem)ieNum.Current); } return(retEQ); }
public void ParseIt(string strForParsing) { scOp = new OperatorStack(); eqResult = new ExecutionQueue(); string strSrc = strForParsing; scOp.Clear(); int pos = 0; bool isFirstOperator = true; EnmOperators opCurrent; while (pos < strSrc.Length) { if ((opCurrent = IsOperator(strSrc, isFirstOperator, ref pos)) != EnmOperators.Nop) { if (opCurrent != EnmOperators.Blank) { OperatorStackManager(opCurrent); if (opCurrent == EnmOperators.RightPar) { isFirstOperator = false; } else { isFirstOperator = true; } } continue; } eqResult.Enqueue(GetOperand(strSrc, ref pos)); isFirstOperator = false; } while (scOp.Count > 0) { eqResult.Enqueue(new ExecutionItem(scOp.Pop())); } }
public static Variant CalcIt(ExecutionQueue eq) { Calculator c = new Calculator(); return c.CalcIt(eq); }
private void DoOperator(EnmOperators op, ExecutionQueue eq) { switch(op) { case EnmOperators.UnMinus: case EnmOperators.Nop: case EnmOperators.Not: case EnmOperators.UnPlus: if(calcStack.Count < 1) throw(new CalcException("Stack is empty on " + op.ToString())); break; default: if(calcStack.Count < 2) throw(new CalcException("Stack is empty on " + op.ToString())); break; } switch(op) { case EnmOperators.UnMinus: case EnmOperators.Not: calcStack.Push(-calcStack.Pop()); break; case EnmOperators.UnPlus: break; case EnmOperators.Plus: calcStack.Push(calcStack.Pop() + calcStack.Pop()); break; case EnmOperators.Minus: calcStack.Push(calcStack.Pop() - calcStack.Pop()); break; case EnmOperators.Mul: calcStack.Push(calcStack.Pop() * calcStack.Pop()); break; case EnmOperators.Div: calcStack.Push(calcStack.Pop() / calcStack.Pop()); break; case EnmOperators.Gr: calcStack.Push(calcStack.Pop() > calcStack.Pop()); break; case EnmOperators.Ls: calcStack.Push(calcStack.Pop() < calcStack.Pop()); break; case EnmOperators.GrEq: calcStack.Push(calcStack.Pop() >= calcStack.Pop()); break; case EnmOperators.LsEq: calcStack.Push(calcStack.Pop() <= calcStack.Pop()); break; case EnmOperators.Eq: calcStack.Push(calcStack.Pop() == calcStack.Pop()); break; case EnmOperators.NtEq: calcStack.Push(calcStack.Pop() != calcStack.Pop()); break; default: throw(new CalcException("Operator " + op.ToString() + " is not supported yet")); } }
public static Variant CalcIt(ExecutionQueue eq) { Calculator c = new Calculator(); return(c.CalcIt(eq)); }
public static Variant Evaluate(String s) { ExecutionQueue eq = ParseIt(s); return(CalcIt(eq)); }
public Variant CalcIt(ExecutionQueue eq) { ExecutionItem ei; if (eq.Count == 0) { return(new Variant("")); } while (eq.Count > 0) { ei = eq.Dequeue(); switch (ei.itemType) { case ItemType.itBool: if (String.Compare(ei.itemString, "True", true) == 0) { calcStack.Push(new Variant(true)); } else { calcStack.Push(new Variant(false)); } break; case ItemType.itString: calcStack.Push(new Variant(ei.itemString)); break; case ItemType.itDigit: try { int i = int.Parse(ei.itemString); calcStack.Push(new Variant(i)); } catch { double d; try { d = double.Parse(ei.itemString); } catch { throw(new CalcException("Bad digital format")); } calcStack.Push(new Variant(d)); } break; case ItemType.itDate: DateTime dt; try { dt = DateTime.Parse(ei.itemString); } catch { throw(new CalcException("Bad date format")); } calcStack.Push(new Variant(dt)); break; case ItemType.itOperator: DoOperator(ei.itemOperator, eq); break; case ItemType.itFunction: DoFunction(ei); break; case ItemType.itVariable: if (!Variables.ContainsKey(ei.itemString)) { throw(new CalcException("Bad variable name !")); } calcStack.Push(new Variant(Variables[ei.itemString])); break; default: throw(new CalcException("Bad item in execution queue")); } } return(calcStack.Pop()); }
private void DoOperator(EnmOperators op, ExecutionQueue eq) { switch (op) { case EnmOperators.UnMinus: case EnmOperators.Nop: case EnmOperators.Not: case EnmOperators.UnPlus: if (calcStack.Count < 1) { throw(new CalcException("Stack is empty on " + op.ToString())); } break; default: if (calcStack.Count < 2) { throw(new CalcException("Stack is empty on " + op.ToString())); } break; } switch (op) { case EnmOperators.UnMinus: case EnmOperators.Not: calcStack.Push(-calcStack.Pop()); break; case EnmOperators.UnPlus: break; case EnmOperators.Plus: calcStack.Push(calcStack.Pop() + calcStack.Pop()); break; case EnmOperators.Minus: calcStack.Push(calcStack.Pop() - calcStack.Pop()); break; case EnmOperators.Mul: calcStack.Push(calcStack.Pop() * calcStack.Pop()); break; case EnmOperators.Div: calcStack.Push(calcStack.Pop() / calcStack.Pop()); break; case EnmOperators.Gr: calcStack.Push(calcStack.Pop() > calcStack.Pop()); break; case EnmOperators.Ls: calcStack.Push(calcStack.Pop() < calcStack.Pop()); break; case EnmOperators.GrEq: calcStack.Push(calcStack.Pop() >= calcStack.Pop()); break; case EnmOperators.LsEq: calcStack.Push(calcStack.Pop() <= calcStack.Pop()); break; case EnmOperators.Eq: calcStack.Push(calcStack.Pop() == calcStack.Pop()); break; case EnmOperators.NtEq: calcStack.Push(calcStack.Pop() != calcStack.Pop()); break; default: throw(new CalcException("Operator " + op.ToString() + " is not supported yet")); } }