Exemplo n.º 1
0
        public bool IsEqual(ICleanerNode n)
        {
            if (n == null)
            {
                return(false);
            }

            if (n.GetType() == typeof(ComplexCleanerNode))
            {
                ComplexCleanerNode ccnn = (ComplexCleanerNode)n;
                if (ccnn.subNodes.Count != subNodes.Count ||
                    (ccnn.powerNode != null && ccnn.powerNode.IsEqual(powerNode)) ||
                    (ccnn.powerNode == null && powerNode != null))
                {
                    return(false);
                }

                for (int i = 0; i < subNodes.Count; i++)
                {
                    if (!subNodes[i].IsEqual(ccnn.subNodes[i]))
                    {
                        return(false);
                    }
                }

                return(true);
            }
            return(false);
        }
Exemplo n.º 2
0
        public static string Clean(string exp)
        {
            Queue <ICleanerNode> q = Shant(exp);
            Stack <ICleanerNode> s = new Stack <ICleanerNode>();

            while (q.Count > 0)
            {
                ICleanerNode node = q.Dequeue();
                if (node.GetType() == typeof(CleanerOperatorNode))
                {
                    CleanerOperatorNode operatorNode = (CleanerOperatorNode)node;

                    IComputableCleanerNode n1 = s.Count > 0 ? (IComputableCleanerNode)s.Pop() : null;
                    IComputableCleanerNode n2 = s.Count > 0 ? (IComputableCleanerNode)s.Pop() : null;

                    ICleanerNode n = operatorNode.Execute(n2, n1);
                    s.Push(n);
                }
                else
                {
                    s.Push(node);
                }
            }

            return(s.Pop().ToString());
        }
Exemplo n.º 3
0
        public ICleanerNode Sub(ICleanerNode a)
        {
            if (typeof(ComplexCleanerNode) == a.GetType())
            {
                ((ComplexCleanerNode)a).IterateOverComputables((IComputableCleanerNode node, int i) =>
                {
                    Sub(node);
                });

                return(this);
            }
            else if (typeof(CleanerNode) == a.GetType())
            {
                for (int i = 0; i < subNodes.Count; i++)
                {
                    if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType()))
                    {
                        continue;
                    }
                    IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i];
                    if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a))
                    {
                        subNodes[i] = (CleanerNode)node - (CleanerNode)a;
                    }
                }
                return(this);
            }
            throw new System.NotImplementedException();
        }
Exemplo n.º 4
0
 private static byte GetOV(ICleanerNode node)
 {
     if (node.GetType() == typeof(CleanerOperatorNode))
     {
         return(GetOV(((CleanerOperatorNode)node).type));
     }
     return(255);
 }
Exemplo n.º 5
0
 public bool IsEqual(ICleanerNode n)
 {
     if (typeof(CleanerOperatorNode) == n.GetType())
     {
         return(((CleanerOperatorNode)n).type == type);
     }
     return(false);
 }
Exemplo n.º 6
0
 public ICleanerNode Power(ICleanerNode a)
 {
     if (!typeof(IComputableCleanerNode).IsAssignableFrom(a.GetType()))
     {
         throw new System.Exception("Uncomputable node type " + a.GetType().Name);
     }
     powerNode = (IComputableCleanerNode)a;
     return(this);
 }
Exemplo n.º 7
0
 public ICleanerNode Divide(ICleanerNode b)
 {
     if (CN_TYPE == b.GetType())
     {
         return(this / (CleanerNode)b);
     }
     else if (typeof(ComplexCleanerNode) == b.GetType())
     {
         return(new ComplexCleanerNode(this, new CleanerOperatorNode('/'), b));
     }
     throw new NotImplementedException();
 }
Exemplo n.º 8
0
 public ICleanerNode Multiply(ICleanerNode a)
 {
     if (typeof(CleanerNode) == a.GetType())
     {
         return((CleanerNode)a * this);
     }
     else if (typeof(ComplexCleanerNode) == a.GetType())
     {
         return(((ComplexCleanerNode)a).Multiply(this));
     }
     throw new NotImplementedException();
 }
Exemplo n.º 9
0
 public ICleanerNode Power(ICleanerNode a)
 {
     if (a.GetType() == typeof(CleanerNode))
     {
         return(this ^ (CleanerNode)a);
     }
     else if (a.GetType() == typeof(ComplexCleanerNode))
     {
         return(this ^ (ComplexCleanerNode)a);
     }
     throw new NotImplementedException();
 }
Exemplo n.º 10
0
 public ICleanerNode Add(ICleanerNode a)
 {
     if (CN_TYPE == a.GetType())
     {
         if (!CanAdd(this, (CleanerNode)a))
         {
             return(new ComplexCleanerNode(this, new CleanerOperatorNode('+'), a));
         }
         return((CleanerNode)a + this);
     }
     else if (typeof(ComplexCleanerNode) == a.GetType())
     {
         return(((ComplexCleanerNode)a).Add(this));
     }
     throw new NotImplementedException();
 }
Exemplo n.º 11
0
 public ICleanerNode Sub(ICleanerNode a)
 {
     if (CN_TYPE == a.GetType())
     {
         if (!CanAdd(this, (CleanerNode)a))
         {
             return(new ComplexCleanerNode(this, new CleanerOperatorNode('+'), -(CleanerNode)a));
         }
         return(this - (CleanerNode)a);
     }
     else if (typeof(ComplexCleanerNode) == a.GetType())
     {
         return(((IComputableCleanerNode)((ComplexCleanerNode)a).Multiply(new CleanerNode(1, CleanerOperatorNode.NO_ID))).Add(this));
     }
     throw new NotImplementedException();
 }
Exemplo n.º 12
0
        public ICleanerNode Add(ICleanerNode a)
        {
            if (typeof(ComplexCleanerNode) == a.GetType())
            {
                ComplexCleanerNode ccna = ((ComplexCleanerNode)a);
                for (int j = 0; j < ccna.subNodes.Count; j++)
                {
                    if (!typeof(IComputableCleanerNode).IsAssignableFrom(ccna.subNodes[j].GetType()))
                    {
                        continue;
                    }
                    Add(ccna.subNodes[j]);
                }

                return(this);
            }
            else if (typeof(CleanerNode) == a.GetType())
            {
                bool added = false;

                for (int i = 0; i < subNodes.Count; i++)
                {
                    if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType()))
                    {
                        continue;
                    }
                    IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i];
                    if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a))
                    {
                        added       = true;
                        subNodes[i] = (CleanerNode)node + (CleanerNode)a;
                        break;
                    }
                }

                if (!added)
                {
                    subNodes.Add(new CleanerOperatorNode('+'));
                    subNodes.Add(a);
                }

                return(this);
            }
            throw new System.NotImplementedException();
        }
Exemplo n.º 13
0
        public ICleanerNode Divide(ICleanerNode a)
        {
            if (a.GetType() == typeof(ComplexCleanerNode))
            {
                if (a.IsEqual(this))
                {
                    return(new CleanerNode(1, CleanerOperatorNode.NO_ID));
                }

                ComplexCleanerNode ccna = (ComplexCleanerNode)a;

                if (BodyEquals(ccna))
                {
                    ComplexCleanerNode     n   = new ComplexCleanerNode(subNodes.ToArray());
                    IComputableCleanerNode cpn = powerNode == null ? new CleanerNode(1, CleanerOperatorNode.NO_ID) : powerNode;
                    IComputableCleanerNode apn = powerNode == null ? new CleanerNode(1, CleanerOperatorNode.NO_ID) : ccna.powerNode;

                    n.powerNode = (IComputableCleanerNode)cpn.Sub(apn);
                    return(n);
                }
            }
            return(new ComplexCleanerNode(this, new CleanerOperatorNode('/'), a));
        }
Exemplo n.º 14
0
        public bool IsEqual(ICleanerNode n)
        {
            if (n.GetType() != typeof(CleanerNode))
            {
                return(false);
            }

            CleanerNode cnn = (CleanerNode)n;

            if (value != cnn.value || identifiers.Length != cnn.identifiers.Length)
            {
                return(false);
            }

            for (int i = 0; i < identifiers.Length; i++)
            {
                if (!identifiers[i].IsEqual(cnn.identifiers[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 15
0
        public override string ToString()
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            ICleanerNode pn = null, nn = null;

            for (int i = 0; i < subNodes.Count; i++)
            {
                nn = i < subNodes.Count - 1 ? subNodes[i + 1] : null;

                if (pn != null)
                {
                    if (pn.GetType() == typeof(CleanerOperatorNode))
                    {
                        if (((CleanerOperatorNode)pn).type == '*')
                        {
                            sb.Remove(sb.Length - 1, 1);
                            if (subNodes[i].GetType() == typeof(ComplexCleanerNode))
                            {
                                sb.Append(string.Format("({0})", subNodes[i]));
                            }
                            else
                            {
                                sb.Append(subNodes[i]);
                            }
                        }
                        else if (((CleanerOperatorNode)pn).type == '/')
                        {
                            if (subNodes[i].GetType() == typeof(ComplexCleanerNode))
                            {
                                sb.Append(string.Format("({0})", subNodes[i]));
                            }
                            else
                            {
                                sb.Append(subNodes[i]);
                            }
                        }
                        else
                        {
                            sb.Append(subNodes[i]);
                        }
                    }
                    else
                    {
                        sb.Append(subNodes[i].ToString());
                    }
                }
                else
                {
                    if (nn != null && nn.GetType() == typeof(CleanerOperatorNode))
                    {
                        if (((CleanerOperatorNode)nn).type == '*' ||
                            ((CleanerOperatorNode)nn).type == '/')
                        {
                            if (subNodes[i].GetType() == typeof(ComplexCleanerNode))
                            {
                                sb.Append(string.Format("({0})", subNodes[i]));
                            }
                            else
                            {
                                sb.Append(subNodes[i]);
                            }
                        }
                        else
                        {
                            sb.Append(subNodes[i].ToString());
                        }
                    }
                    else
                    {
                        sb.Append(subNodes[i].ToString());
                    }
                }

                pn = subNodes[i];
            }

            if (powerNode != null)
            {
                sb.Insert(0, "(");
                sb.Append(")^");
                if (powerNode.GetType() == typeof(ComplexCleanerNode))
                {
                    sb.Append(string.Format("({0})", powerNode.ToString()));
                }
                else if (powerNode.GetType() == typeof(CleanerNode))
                {
                    sb.Append(powerNode.ToString());
                }
            }

            return(sb.ToString());
        }
Exemplo n.º 16
0
        public ICleanerNode Multiply(ICleanerNode a)
        {
            if (typeof(ComplexCleanerNode) == a.GetType())
            {
                ComplexCleanerNode cnna = (ComplexCleanerNode)a;

                if (cnna.IsEqual(this))
                {
                    ComplexCleanerNode n = new ComplexCleanerNode(subNodes.ToArray());

                    if (cnna.powerNode == null && powerNode == null)
                    {
                        n.powerNode = new CleanerNode(2, CleanerOperatorNode.NO_ID);
                    }
                    else if (cnna.powerNode == null)
                    {
                        n.powerNode = (IComputableCleanerNode)powerNode.Add(new CleanerNode(1, CleanerOperatorNode.NO_ID));
                    }
                    else if (powerNode == null)
                    {
                        n.powerNode = (IComputableCleanerNode)cnna.powerNode.Add(new CleanerNode(1, CleanerOperatorNode.NO_ID));
                    }
                    else
                    {
                        n.powerNode = (IComputableCleanerNode)powerNode.Add(cnna.powerNode);
                    }
                    return(n);
                }

                if ((powerNode == null && cnna.powerNode == null) ||
                    (powerNode != null && !powerNode.IsEqual(cnna.powerNode)) ||
                    (powerNode == null && cnna.powerNode != null))
                {
                    return(new ComplexCleanerNode(this, new CleanerOperatorNode('*'), cnna));
                }

                cnna.IterateOverComputables((IComputableCleanerNode node, int i) =>
                {
                    Multiply(node);
                });
                return(this);
            }
            else if (typeof(CleanerNode) == a.GetType())
            {
                if (powerNode != null)
                {
                    return(new ComplexCleanerNode(this, new CleanerOperatorNode('*'), a));
                }

                if (subNodes[1].GetType() == typeof(CleanerOperatorNode))
                {
                    if (((CleanerOperatorNode)subNodes[1]).type == '*' ||
                        ((CleanerOperatorNode)subNodes[1]).type == '/')
                    {
                        for (int i = 0; i < subNodes.Count; i++)
                        {
                            if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType()))
                            {
                                continue;
                            }
                            IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i];
                            subNodes[i] = node.Multiply((CleanerNode)a);
                            break;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < subNodes.Count; i++)
                        {
                            if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType()))
                            {
                                continue;
                            }
                            IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i];
                            subNodes[i] = node.Multiply((CleanerNode)a);
                        }
                    }
                }
                return(this);
            }
            throw new System.NotImplementedException();
        }
Exemplo n.º 17
0
 public CleanerNode(float value, Identifier[] identifiers, ICleanerNode pn)
 {
     this.value       = value;
     this.identifiers = identifiers;
     powerNode        = pn;
 }