示例#1
0
 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()));
     }
 }
示例#2
0
 public new ExecutionQueue Clone()
 {
     ExecutionQueue retEQ = new ExecutionQueue();
     IEnumerator ieNum = this.GetEnumerator();
     while(ieNum.MoveNext())
         retEQ.Enqueue((ExecutionItem)ieNum.Current);
     return retEQ;
 }
示例#3
0
 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();
 }
示例#4
0
        public new ExecutionQueue Clone()
        {
            ExecutionQueue retEQ = new ExecutionQueue();
            IEnumerator    ieNum = this.GetEnumerator();

            while (ieNum.MoveNext())
            {
                retEQ.Enqueue((ExecutionItem)ieNum.Current);
            }
            return(retEQ);
        }
示例#5
0
        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()));
            }
        }
示例#6
0
 public static Variant CalcIt(ExecutionQueue eq)
 {
     Calculator c = new Calculator();
     return c.CalcIt(eq);
 }
示例#7
0
        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"));
            }
        }
示例#8
0
        public static Variant CalcIt(ExecutionQueue eq)
        {
            Calculator c = new Calculator();

            return(c.CalcIt(eq));
        }
示例#9
0
        public static Variant Evaluate(String s)
        {
            ExecutionQueue eq = ParseIt(s);

            return(CalcIt(eq));
        }
示例#10
0
        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());
        }
示例#11
0
        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"));
            }
        }