예제 #1
0
 /// <summary>
 /// Adds the supplied operator to the tree.
 /// The operator is added according to precedence and associativity.
 /// </summary>
 /// <param name="topNode">The top node of the tree.</param>
 /// <param name="next">The operator to add.</param>
 private void AddToTree(ref ExpressionItem topNode, ExpressionItem next)
 {
     if (topNode is OperatorItem)
     {
         OperatorItem currentNode = (OperatorItem)topNode;
         if (currentNode.Configuration.Precedence < ((OperatorItem)next).Configuration.Precedence ||
             (currentNode.Configuration.Precedence == ((OperatorItem)next).Configuration.Precedence &&
              ((OperatorItem)next).Configuration.Associativity == Associativity.left))
         {
             //The top node has lower precedence, or the new operator has left associativity:
             //add it as top node and add the current tree as left parameter.
             ((OperatorItem)next).AddParameter(currentNode);
             topNode = next;
         }
         else if (((OperatorItem)next).Configuration.Associativity == Associativity.left)
         {
             //The new operator has associativity left.
             //Find the first node with same precedence and add the new operator at that position
             //with the found node as left parameter.
             ExpressionItem child = currentNode.Parameters[currentNode.Parameters.Length - 1];
             while (child is OperatorItem &&
                    ((OperatorItem)child).Configuration.Precedence > ((OperatorItem)next).Configuration.Precedence)
             {
                 currentNode = (OperatorItem)child;
                 child       = currentNode.Parameters[currentNode.Parameters.Length - 1];
             }
             ExpressionItem[] currentParams = currentNode.Parameters;
             currentNode.RemoveParameters();
             ((OperatorItem)next).AddParameter(currentParams[currentParams.Length - 1]);
             currentParams[currentParams.Length - 1] = next;
             currentNode.AddParameterRange(currentParams);
         }
         else if (((OperatorItem)next).Configuration.Associativity == Associativity.right)
         {
             //The new node has right associativity.
             //find the first node with lower precedence and add the new operator at that position
             //with the found node as left parameter.
             ExpressionItem child = currentNode.Parameters[currentNode.Parameters.Length - 1];
             while (child is OperatorItem &&
                    ((OperatorItem)child).Configuration.Precedence >= ((OperatorItem)next).Configuration.Precedence)
             {
                 currentNode = (OperatorItem)child;
                 child       = currentNode.Parameters[currentNode.Parameters.Length - 1];
             }
             ExpressionItem[] currentParams = currentNode.Parameters;
             currentNode.RemoveParameters();
             ((OperatorItem)next).AddParameter(currentParams[currentParams.Length - 1]);
             currentParams[currentParams.Length - 1] = next;
             currentNode.AddParameterRange(currentParams);
         }
     }
     else
     {
         //The next item isn't an operator. This case will not be used.
         ((OperatorItem)next).AddParameter(topNode);
         topNode = next;
     }
     //Fill the right hand side of the new operator.
     FillParameters(next);
 }
예제 #2
0
        public Operator(string str)
        {
            if (string.IsNullOrWhiteSpace(str))
            {
                throw new Exception("It is not a Operator");
            }

            string operatorStr = str.Trim();

            //string[] regex = { "^(=|=)$", "^(+|+)$", "^(-|—|-)$", "^(x|X|×)$", "^(/|÷)$", "^(\\(|()$", "^(\\)|))$" };

            int index = -1;

            for (int i = 0; i < operatorRegexes.Length; i++)
            {
                string rule = "^" + operatorRegexes[i] + "$";
                Regex  r    = new Regex(rule, RegexOptions.IgnoreCase);

                // Match the regular expression pattern against a text string.
                Match m = r.Match(str);

                if (m.Success)
                {
                    index = i;
                    break;
                }
            }

            if (index < 0)
            {
                throw new Exception(str + " is not a Operator");
            }

            this.item = (OperatorItem)(index);
        }
예제 #3
0
 public static OperatorItemDto ToDto(this OperatorItem obj)
 {
     return(new()
     {
         Name = obj.Name,
         Rid = obj.Rid
     });
 }
 public ReturnItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
     Type = parent switch
     {
         MethodItem methodItem => methodItem.Method.ReturnType,
         OperatorItem operatorItem => operatorItem.Method.ReturnType,
                    _ => throw new NotSupportedException()
     };
 }
 public ParameterItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
     Parameter = parent switch
     {
         MethodItem methodItem => methodItem.Method.Parameters.First(p => p.Name == Name),
         OperatorItem operatorItem => operatorItem.Method.Parameters.First(p => p.Name == Name),
         ConstructorItem constructorItem => constructorItem.Constructor.Parameters.First(p => p.Name == Name),
         PropertyItem property => property.Property.Parameters.First(p => p.Name == Name),
         _ => throw new NotSupportedException()
     };
 }
예제 #6
0
 private void RefreshOperators()
 {
     if (!IsInitialized)
     {
         return;
     }
     if (cmbAttribute.SelectedItem is AttributeItem attributeItem && attributeItem.Metadata.AttributeType is AttributeTypeCode attributeType)
     {
         //cmbOperator.SelectedItem = null;
         cmbOperator.Items.Clear();
         cmbOperator.Items.AddRange(OperatorItem.GetConditionsByAttributeType(attributeType));
         ReFillControl(cmbOperator);
     }
 }
예제 #7
0
        private void buttonAdd_Click(object sender, EventArgs e)
        {
            if (comboBoxField.SelectedItem == null || comboBoxOperator.SelectedItem == null)
            {
                return;
            }

            FieldItem    selectedField    = (FieldItem)comboBoxField.SelectedItem;
            OperatorItem selectedOperator = (OperatorItem)comboBoxOperator.SelectedItem;
            string       value            = textBoxValue.Text;

            Condition.Add(selectedField.Field, selectedOperator.Operator, value);

            FillList();
        }
예제 #8
0
 private void cmbAttribute_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (cmbAttribute.SelectedItem != null)
     {
         var attributeType = ((AttributeItem)cmbAttribute.SelectedItem).Metadata.AttributeType;
         if (attributeType.HasValue)
         {
             var tmpColl = ControlUtils.GetAttributesCollection(this.Controls, false);
             cmbOperator.SelectedItem = null;
             cmbOperator.Items.Clear();
             cmbOperator.Items.AddRange(OperatorItem.GetConditionsByAttributeType(attributeType.Value));
             ControlUtils.FillControl(tmpColl, cmbOperator);
         }
     }
     UpdateValueField();
 }
        private void operatorList_Tap(object sender, System.Windows.Input.GestureEventArgs e)
        {
            if (operatorList.SelectedItem != null)
            {
                clpb.Visibility = System.Windows.Visibility.Visible;
                OperatorItem sItem = operatorList.SelectedItem as OperatorItem;

                shablnUSSD = sItem.SHBLN;
                shablnType = sItem.TYPE;
                // Выбрать номер телефона
                if (shablnType == "31")
                {
                    if (Options.phonenumberhelp == true)
                    {
                        StartPhoneTask();
                        return;
                    }
                    ShowAddToClipboard(sItem.USSD);
                }
                // Ввести число
                else if (shablnType == "32")
                {
                    if (Options.phonenumberhelp == true)
                    {
                        StartUSSDEdit();
                        return;
                    }
                    ShowAddToClipboard(sItem.USSD);
                }
                // Ввести число и номер телефона
                else if (shablnType == "33")
                {
                    if (Options.phonenumberhelp == true)
                    {
                        StartPhoneTask();
                        return;
                    }
                    ShowAddToClipboard(sItem.USSD);
                }
                else
                {
                    ShowAddToClipboard(sItem.USSD);
                }
            }
        }
예제 #10
0
    void AddButtonList(IEnumerable <ParseObject> rersult)
    {
        foreach (Transform child in contentRect.GetComponentsInChildren <Transform>())
        {
            if (child.gameObject.name.Equals("OperatorItem"))
            {
                Destroy(child.gameObject);
            }
        }


        for (int i = 0; i < results.Count; i++)
        {
            ParseObject obj = results[i];

            //Debug.Log(obj["stars"].GetType());
            if (isAttack)
            {
                if (obj["team"].Equals("Attackers"))
                {
                    GameObject newobj;
                    newobj = (GameObject)Instantiate(operatorPrefab);
                    newobj.transform.SetParent(contentRect);
                    newobj.transform.localScale = new Vector3(1f, 1f, 1f);
                    newobj.name = "OperatorItem";
                    OperatorItem map = newobj.GetComponent <OperatorItem>();
                    map.Setup(obj, this);
                }
            }
            else
            {
                if (obj["team"].Equals("Defenders"))
                {
                    GameObject newobj;
                    newobj = (GameObject)Instantiate(operatorPrefab);
                    newobj.transform.SetParent(contentRect);
                    newobj.transform.localScale = new Vector3(1f, 1f, 1f);
                    newobj.name = "OperatorItem";
                    OperatorItem map = newobj.GetComponent <OperatorItem>();
                    map.Setup(obj, this);
                }
            }
        }
    }
예제 #11
0
        private int CalculateSection(int operand1, int operand2, OperatorItem oper)
        {
            switch (oper)
            {
            case OperatorItem.Plus:
                return(operand1 + operand2);

            case OperatorItem.Minus:
                return(operand1 - operand2);

            case OperatorItem.Times:
                return(operand1 * operand2);

            case OperatorItem.Divides:
                return(operand1 / operand2);

            default:
                throw new Exception("Fail to calculate.");
            }
        }
예제 #12
0
        private static Dictionary <string, AMemberItem> Parse(XDocument document)
        {
            Dictionary <string, AMemberItem> items = new Dictionary <string, AMemberItem>();

            AMemberItem HandleTypeItem(XElement typeElement)
            {
                string parentNamespace = typeElement.GetNamespace();

                if (!items.TryGetValue($"{TypeItem.Id}{parentNamespace}", out AMemberItem parent) &&
                    !items.TryGetValue($"{NamespaceItem.Id}{parentNamespace}", out parent))
                {
                    parent = new NamespaceItem(parentNamespace);
                    items.Add($"{NamespaceItem.Id}{parent.Name}", parent);
                }

                TypeItem typeItem = new TypeItem(parent, typeElement);

                items.Add(typeElement.GetFullName(), typeItem);

                return(typeItem);
            }

            foreach (XElement element in document.GetMembers().Where(e => e.GetFullName().StartsWith(TypeItem.Id)))
            {
                HandleTypeItem(element);
            }

            foreach (XElement element in document.GetMembers().Where(e => !e.GetFullName().StartsWith(TypeItem.Id)))
            {
                string parentFullName = element.GetNamespace();
                if (!items.TryGetValue($"{TypeItem.Id}{parentFullName}", out AMemberItem parent))
                {
                    parent = HandleTypeItem(TypeItem.CreateEmptyXElement(parentFullName));
                }
                AMemberItem newItem;

                string fullName = element.GetFullName();
                if (fullName.StartsWith(FieldItem.Id))
                {
                    newItem = new FieldItem(parent, element);
                }
                else if (fullName.StartsWith(PropertyItem.Id))
                {
                    newItem =
                        fullName.EndsWith(")")
                        ? new IndexItem(new MethodItem(parent, element))
                        : new PropertyItem(parent, element) as AMemberItem;
                }
                else if (fullName.StartsWith(MethodItem.Id))
                {
                    newItem = new MethodItem(parent, element);
                    newItem =
                        newItem.Name.StartsWith("#")
                        ? new ConstructorItem(newItem as MethodItem)
                        : OperatorItem.HandleOperator(newItem as MethodItem);
                }
                else if (fullName.StartsWith(EventItem.Id))
                {
                    newItem = new EventItem(parent, element);
                }
                else
                {
                    throw new Exception($"unhandled doc item {fullName}");
                }

                items.Add(fullName, newItem);
            }

            return(items);
        }
예제 #13
0
        // 0 -- the same priority
        // -1 -- item < other
        // 1 -- item > other
        // 2 -- error
        public int compare(Operator otherOps)
        {
            OperatorItem other = otherOps.GetOperator();

            switch (item)
            {
            case OperatorItem.Plus:
                switch (other)
                {
                case OperatorItem.Plus:
                case OperatorItem.Minus:
                    return(1);

                case OperatorItem.Times:
                case OperatorItem.Divides:
                case OperatorItem.LeftBrace:
                    return(-1);

                case OperatorItem.RightBrace:
                case OperatorItem.StackTop:
                    return(1);
                }
                break;

            case OperatorItem.Minus:
                switch (other)
                {
                case OperatorItem.Plus:
                case OperatorItem.Minus:
                    return(1);

                case OperatorItem.Times:
                case OperatorItem.Divides:
                case OperatorItem.LeftBrace:
                    return(-1);

                case OperatorItem.RightBrace:
                case OperatorItem.StackTop:
                    return(1);
                }
                break;

            case OperatorItem.Times:
                switch (other)
                {
                case OperatorItem.Plus:
                case OperatorItem.Minus:
                case OperatorItem.Times:
                case OperatorItem.Divides:
                    return(1);

                case OperatorItem.LeftBrace:
                    return(-1);

                case OperatorItem.RightBrace:
                case OperatorItem.StackTop:
                    return(1);
                }
                break;

            case OperatorItem.Divides:
                switch (other)
                {
                case OperatorItem.Plus:
                case OperatorItem.Minus:
                case OperatorItem.Times:
                case OperatorItem.Divides:
                    return(1);

                case OperatorItem.LeftBrace:
                    return(-1);

                case OperatorItem.RightBrace:
                case OperatorItem.StackTop:
                    return(1);
                }
                break;

            case OperatorItem.LeftBrace:
                switch (other)
                {
                case OperatorItem.Plus:
                case OperatorItem.Minus:
                case OperatorItem.Times:
                case OperatorItem.Divides:
                case OperatorItem.LeftBrace:
                    return(-1);

                case OperatorItem.RightBrace:
                    return(0);

                case OperatorItem.StackTop:
                    return(2);
                }
                break;

            case OperatorItem.RightBrace:
                switch (other)
                {
                case OperatorItem.Plus:
                case OperatorItem.Minus:
                case OperatorItem.Times:
                case OperatorItem.Divides:
                    return(1);

                case OperatorItem.LeftBrace:
                    return(2);

                case OperatorItem.RightBrace:
                case OperatorItem.StackTop:
                    return(1);
                }
                break;

            case OperatorItem.StackTop:
                switch (other)
                {
                case OperatorItem.Plus:
                case OperatorItem.Minus:
                case OperatorItem.Times:
                case OperatorItem.Divides:
                case OperatorItem.LeftBrace:
                    return(-1);

                case OperatorItem.RightBrace:
                    return(2);

                case OperatorItem.StackTop:
                    return(0);
                }
                break;
            }

            return(2);
        }
예제 #14
0
 public Operator()
 {
     this.item = OperatorItem.StackTop;
 }