Ejemplo n.º 1
0
        private string doEvaluate(Node node, IdentifierLookup lookup)
        {
            if ((node.Operator == tkIF.ToString()) && (node.Condition != null))
              {

            var cond = doEvaluate(node.Condition, lookup);
            if (string.Equals(cond,"1") ||
            string.Equals(cond, "true", StringComparison.InvariantCultureIgnoreCase) ||
            string.Equals(cond, "yes", StringComparison.InvariantCultureIgnoreCase))
              return (node.Left == null) ? "" : doEvaluate(node.Left, lookup);
            else
              return (node.Right == null) ? "" : doEvaluate(node.Right, lookup);
              }//if  tkIF

              string lnd = (node.Left == null) ? "" : doEvaluate(node.Left, lookup);
              string rnd = (node.Right == null) ? "" : doEvaluate(node.Right, lookup);

              //resolve identifier
              if ((lnd == "") && (rnd == ""))
              {
            string rslt = node.Operator;

            if (lookup!=null) rslt = lookup(rslt);
            else
             if (OnIdentifierLookup != null) rslt = OnIdentifierLookup(rslt);

            return rslt;
              }//if

              double left;
              double right;

              try
              {
            left = getVal(lnd);
            right = getVal(rnd);
              }
              catch
              {
            if ((node.Operator == tkMINUS) && (lnd == ""))//test for unary -
            {
              try
              {
            right = getVal(rnd);//may fail again
            return (-right).ToString();
              }
              catch
              {
              }
            }//if

            if ((node.Operator == tkPLUS) && (lnd != null) && (rnd != null))
              return (((string)lnd) + ((string)rnd));
            else
              throw;
              }

              switch (node.Operator)
              {
            case tkPLUS:
              {
            return (left + right).ToString();
              }
            case tkMINUS:
              {
            return (left - right).ToString();
              }
            case tkMUL:
              {
            return (left * right).ToString();
              }
            case tkDIV:
              {
            return (left / right).ToString();
              }
            case tkMOD:
              {
            return (left % right).ToString();
              }

            case tkEQ:
              {
            return ((left == right) ? "1" : "0");
              }
            case tkLE:
              {
            return ((left <= right) ? "1" : "0");
              }
            case tkGE:
              {
            return ((left >= right) ? "1" : "0");
              }
            case tkL:
              {
            return ((left < right) ? "1" : "0");
              }
            case tkG:
              {
            return ((left > right) ? "1" : "0");
              }
            case tkNE:
              {
            return ((left != right) ? "1" : "0");
              }

            case tkAND:
              {
            return (((left != 0) && (right != 0)) ? "1" : "0");
              }
            case tkOR:
              {
            return (((left != 0) || (right != 0)) ? "1" : "0");
              }
            case tkXOR:
              {
            return (((left != 0) ^ (right != 0)) ? "1" : "0");
              }
            case tkNOT:
              {
            return ((!(right != 0)) ? "1" : "0");
              }

            default:
              {
            /* call delegate here*/
            break;
              }//default
              }//switch

              return null;
        }
Ejemplo n.º 2
0
        }//getVal

        private string doEvaluate(Node node, IdentifierLookup lookup)
        {
            if ((node.Operator == tkIF.ToString()) && (node.Condition != null))
            {
                var cond = doEvaluate(node.Condition, lookup);
                if (string.Equals(cond, "1") ||
                    string.Equals(cond, "true", StringComparison.InvariantCultureIgnoreCase) ||
                    string.Equals(cond, "yes", StringComparison.InvariantCultureIgnoreCase))
                {
                    return((node.Left == null) ? "" : doEvaluate(node.Left, lookup));
                }
                else
                {
                    return((node.Right == null) ? "" : doEvaluate(node.Right, lookup));
                }
            }//if  tkIF


            string lnd = (node.Left == null) ? "" : doEvaluate(node.Left, lookup);
            string rnd = (node.Right == null) ? "" : doEvaluate(node.Right, lookup);

            //resolve identifier
            if ((lnd == "") && (rnd == ""))
            {
                string rslt = node.Operator;

                if (lookup != null)
                {
                    rslt = lookup(rslt);
                }
                else
                if (OnIdentifierLookup != null)
                {
                    rslt = OnIdentifierLookup(rslt);
                }

                return(rslt);
            }//if


            double left;
            double right;


            try
            {
                left  = getVal(lnd);
                right = getVal(rnd);
            }
            catch
            {
                if ((node.Operator == tkMINUS) && (lnd == ""))//test for unary -
                {
                    try
                    {
                        right = getVal(rnd);//may fail again
                        return((-right).ToString());
                    }
                    catch
                    {
                    }
                }//if

                if ((node.Operator == tkPLUS) && (lnd != null) && (rnd != null))
                {
                    return(((string)lnd) + ((string)rnd));
                }
                else
                {
                    throw;
                }
            }



            switch (node.Operator)
            {
            case tkPLUS:
            {
                return((left + right).ToString());
            }

            case tkMINUS:
            {
                return((left - right).ToString());
            }

            case tkMUL:
            {
                return((left * right).ToString());
            }

            case tkDIV:
            {
                return((left / right).ToString());
            }

            case tkMOD:
            {
                return((left % right).ToString());
            }

            case tkEQ:
            {
                return((left == right) ? "1" : "0");
            }

            case tkLE:
            {
                return((left <= right) ? "1" : "0");
            }

            case tkGE:
            {
                return((left >= right) ? "1" : "0");
            }

            case tkL:
            {
                return((left < right) ? "1" : "0");
            }

            case tkG:
            {
                return((left > right) ? "1" : "0");
            }

            case tkNE:
            {
                return((left != right) ? "1" : "0");
            }

            case tkAND:
            {
                return(((left != 0) && (right != 0)) ? "1" : "0");
            }

            case tkOR:
            {
                return(((left != 0) || (right != 0)) ? "1" : "0");
            }

            case tkXOR:
            {
                return(((left != 0) ^ (right != 0)) ? "1" : "0");
            }

            case tkNOT:
            {
                return((!(right != 0)) ? "1" : "0");
            }

            default:
            {
                /* call delegate here*/
                break;
            } //default
            } //switch

            return(null);
        }//Evaluator doEvaluate
Ejemplo n.º 3
0
 /// <summary>
 /// Evaluate expression and return result - either string or numerical value
 /// </summary>
 public string Evaluate(IdentifierLookup lookup = null)
 {
     return doEvaluate(m_Root, lookup);
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Evaluate expression and return result - either string or numerical value
 /// </summary>
 public string Evaluate(IdentifierLookup lookup = null)
 {
     return(doEvaluate(m_Root, lookup));
 }//Evaluator.evaluate