public override DCExpressionItem Clone()
        {
            DCFunctionExpressionItem item = (DCFunctionExpressionItem)this.MemberwiseClone();

            if (this._Parameters != null)
            {
                item._Parameters = this._Parameters.CloneDeeply();
            }
            return(item);
        }
Пример #2
0
        /// <summary>
        /// 解析表达式项目
        /// </summary>
        /// <param name="rootItem"></param>
        /// <param name="tokens"></param>
        private void ParseItem(DCExpressionItem rootItem, DCTokenList tokens)
        {
            List <DCExpressionItem> items = new List <DCExpressionItem>();

            while (tokens.MoveNext())
            {
                DCExpressionItem newItem = null;
                DCToken          token   = tokens.Current;
                if (token.Type == CharType.Symbol)
                {
                    // 根据关键字 And Or 进行修复。
                    if (string.Equals(token.Text, "And", StringComparison.CurrentCultureIgnoreCase))
                    {
                        token.Type = CharType.MathOperator;
                        token.Text = "&&";
                    }
                    else if (string.Equals(token.Text, "or", StringComparison.CurrentCultureIgnoreCase))
                    {
                        token.Type = CharType.MathOperator;
                        token.Text = "||";
                    }
                }
                if (token.Type == CharType.Symbol)
                {
                    // 标识符
                    DCToken next = tokens.NextItem;
                    if (next != null && next.Type == CharType.CurLeft)
                    {
                        // 函数调用
                        tokens.MoveNext();
                        DCFunctionExpressionItem func = new DCFunctionExpressionItem();
                        func.Name = token.Text;
                        ParseItem(func, tokens);
                        newItem          = func;
                        newItem.Priority = 0;
                    }
                    else
                    {
                        if (string.Compare(token.Text, "true", true) == 0)
                        {
                            // 布尔值常量
                            newItem = new DCConstExpressionItem(true, DCValueType.Boolean);
                        }
                        else if (string.Compare(token.Text, "false", true) == 0)
                        {
                            // 布尔值常量
                            newItem = new DCConstExpressionItem(false, DCValueType.Boolean);
                        }
                        else
                        {
                            double dbl = 0;
                            if (double.TryParse(token.Text, out dbl))
                            {
                                // 数字常量
                                newItem = new DCConstExpressionItem(dbl, DCValueType.Number);
                            }
                            else
                            {
                                // 引用的变量
                                DCVariableExpressionItem var = new DCVariableExpressionItem();
                                var.Name = token.Text;
                                newItem  = var;
                            }
                        }
                        newItem.Priority = 0;
                    }
                }
                else if (token.Type == CharType.StringConst)
                {
                    // 字符串常量
                    var strV = token.Text;
                    if (strV != null && strV.Length >= 2)
                    {
                        if (strV[0] == '\'' || strV[0] == '"')
                        {
                            strV = strV.Substring(1, strV.Length - 2);
                        }
                    }
                    newItem = new DCConstExpressionItem(strV, DCValueType.String);
                }
                else if (token.Type == CharType.CurLeft)
                {
                    // 左圆括号,则进行分组
                    DCGroupExpressionItem group = new DCGroupExpressionItem();
                    newItem          = group;
                    newItem.Priority = 0;
                    ParseItem(group, tokens);
                }
                else if (token.Type == CharType.Spliter ||
                         token.Type == CharType.CurRight)
                {
                    // 分隔符号或者右圆括号则退出分组
                    if (items == null || items.Count == 0)
                    {
                        throw new System.Exception("项目分组无效:" + this.Text);
                    }
                    if (items != null && items.Count > 0)
                    {
                        DCExpressionItem item = CollpaseItems(items);
                        rootItem.AddSubItem(item);
                    }
                    items = new List <DCExpressionItem>();
                    if (token.Type == CharType.CurRight)
                    {
                        //退出分组
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                else if (token.Type == CharType.MathOperator ||
                         token.Type == CharType.LogicOperator)
                {
                    // 操作符号

                    DCOperatorExpressionItem math = new DCOperatorExpressionItem();
                    math.Text = token.Text;
                    switch (token.Text)
                    {
                    case "+":
                        math.Operator = DCOperatorType.Plus;
                        math.Priority = 1;
                        break;

                    case "-":
                        math.Operator = DCOperatorType.Minus;
                        math.Priority = 1;
                        break;

                    case "*":
                        math.Operator = DCOperatorType.Multi;
                        math.Priority = 2;
                        break;

                    case "/":
                        math.Operator = DCOperatorType.Division;
                        math.Priority = 2;
                        break;

                    case ">":
                        math.Operator          = DCOperatorType.Bigger;
                        math.Priority          = 0;
                        math.IsLogicExpression = true;
                        break;

                    case ">=":
                        math.Operator          = DCOperatorType.BiggerOrEqual;
                        math.Priority          = 0;
                        math.IsLogicExpression = true;
                        break;

                    case "=":
                        math.Operator          = DCOperatorType.Equal;
                        math.Priority          = 0;
                        math.IsLogicExpression = true;
                        break;

                    case "==":
                        math.Operator          = DCOperatorType.Equal;
                        math.Priority          = 0;
                        math.IsLogicExpression = true;
                        break;

                    case "<":
                        math.Operator          = DCOperatorType.Less;
                        math.Priority          = 0;
                        math.IsLogicExpression = true;
                        break;

                    case "<=":
                        math.Operator          = DCOperatorType.LessOrEqual;
                        math.Priority          = 0;
                        math.IsLogicExpression = true;
                        break;

                    case "%":
                        math.Operator = DCOperatorType.Mod;
                        math.Priority = 2;
                        break;

                    case "||":
                        math.Operator          = DCOperatorType.Or;
                        math.Priority          = -1;
                        math.IsLogicExpression = true;
                        break;

                    case "&&":
                        math.Operator          = DCOperatorType.And;
                        math.Priority          = -1;
                        math.IsLogicExpression = true;
                        break;

                    case "!=":
                        math.Operator          = DCOperatorType.Unequal;
                        math.Priority          = 0;
                        math.IsLogicExpression = true;
                        break;

                    default:
                        throw new NotSupportedException("无效操作符:" + token.Text);
                    }
                    newItem = math;
                }
                else
                {
                    throw new NotSupportedException(token.Type + ":" + token.Text);
                }
                items.Add(newItem);
            }//while
            DCExpressionItem item2 = CollpaseItems(items);

            if (item2 != null)
            {
                rootItem.AddSubItem(item2);
            }
        }