コード例 #1
0
        private static void RewriteNodes(OperNode oper, double operRes)
        {
            ValueNode resNode = new ValueNode(operRes);

            if (oper.NextOper != null)
            {
                oper.NextOper.LeftVal  = resNode;
                oper.NextOper.PrevOper = oper.PrevOper;
            }
            if (oper.PrevOper != null)
            {
                oper.PrevOper.RightVal = resNode;
                oper.PrevOper.NextOper = oper.NextOper;
            }
        }
コード例 #2
0
        private static void CreateNodes(string value, string operType, int operWeight, ref OperNode lastOper)
        {
            double dVal = 0;

            if (!string.IsNullOrEmpty(value))
            {
                dVal = GetValue(value);
            }

            ValueNode valNode = new ValueNode(dVal);
            OperNode  oper    = new OperNode(operType, operWeight, valNode, lastOper);

            if (lastOper != null)
            {
                lastOper.RightVal = valNode;
                lastOper.NextOper = oper;
            }
            lastOper = oper;
            _operList.Add(oper);
        }
コード例 #3
0
        private static void Parse(string expression)
        {
            _operList = new List <OperNode>();

            int    operWeight = 1;
            int    factor     = 1;
            string value      = "";

            OperNode lastOper = null;

            for (int i = 0; i < expression.Length; ++i)
            {
                double dVal     = 0;
                string operType = expression[i].ToString();
                switch (operType)
                {
                case "-":
                case "+":
                    operWeight = 1 * factor;
                    CreateNodes(value, operType, operWeight, ref lastOper);
                    value = "";
                    break;

                case "/":
                case "*":
                    operWeight = 2 * factor;
                    CreateNodes(value, operType, operWeight, ref lastOper);
                    value = "";
                    break;

                case "=":
                    dVal = GetValue(value);
                    ValueNode valNode = new ValueNode(dVal);
                    if (lastOper != null)
                    {
                        lastOper.RightVal = valNode;
                        lastOper.NextOper = null;
                    }
                    break;

                case "(":
                    factor *= 4;
                    break;

                case ")":
                    factor /= 4;
                    if (operWeight < 1)
                    {
                        throw new ArgumentException("Invalid brackets");
                    }
                    break;

                default:
                    value += operType;
                    break;
                }
            }
            if (factor != 1)
            {
                throw new ArgumentException("Invalid brackets");
            }
        }