예제 #1
0
        public int CompareTo(BinaryUnion other)
        {
            if (other == null)
            {
                return(1);
            }

            ISet <Expression> visitedExpressions = new HashSet <Expression>();
            ISet <Expression> expression1        = UnionHelper.Iterate(visitedExpressions, Left.AsSequence().Concat(Right)).ToSortedSet();

            visitedExpressions.Clear();
            ISet <Expression> expression2 = UnionHelper.Iterate(visitedExpressions, other.Left.AsSequence().Concat(other.Right)).ToSortedSet();

            return(expression1.SequenceCompare(expression2));
        }
예제 #2
0
파일: Union.cs 프로젝트: apodavalov/FLaG
        public bool Equals(Union other)
        {
            if (other == null)
            {
                return(false);
            }

            ISet <Expression> visitedExpressions = new HashSet <Expression>();
            ISet <Expression> expression1        = UnionHelper.Iterate(visitedExpressions, Expressions).ToSortedSet();

            visitedExpressions.Clear();
            ISet <Expression> expression2 = UnionHelper.Iterate(visitedExpressions, other.Expressions).ToSortedSet();

            return(expression1.SequenceEqual(expression2));
        }
예제 #3
0
파일: Union.cs 프로젝트: apodavalov/FLaG
        public int CompareTo(Union other)
        {
            if (other == null)
            {
                return(1);
            }

            ISet <Expression> visitedExpressions = new HashSet <Expression>();
            ISet <Expression> expression1        = UnionHelper.Iterate(visitedExpressions, Expressions).ToSortedSet();

            visitedExpressions.Clear();
            ISet <Expression> expression2 = UnionHelper.Iterate(visitedExpressions, other.Expressions).ToSortedSet();

            return(expression1.SequenceCompare(expression2));
        }
예제 #4
0
        public override Expression Optimize()
        {
            ISet <Expression> visitedExpressions = new HashSet <Expression>();

            return(new Union(UnionHelper.Iterate(visitedExpressions, Left.AsSequence().Concat(Right))).Optimize());
        }
예제 #5
0
        internal override void ToString(StringBuilder builder)
        {
            ISet <Expression> visitedExpressions = new HashSet <Expression>();

            UnionHelper.ToString(builder, UnionHelper.Iterate(visitedExpressions, Left.AsSequence().Concat(Right)).ToSortedSet().AsReadOnly(), Priority);
        }
예제 #6
0
파일: Union.cs 프로젝트: apodavalov/FLaG
        public override Expression Optimize()
        {
            bool somethingChanged;

            ISet <Expression> visitedExpressions = new HashSet <Expression>();

            ISet <Expression> set = UnionHelper.Iterate(visitedExpressions, Expressions.Select(e => e.Optimize())).ToHashSet();

            do
            {
                somethingChanged = false;

                if (set.Any(e => e.CanBeEmpty()))
                {
                    set = set.Select(e => e.TryToLetItBeEmpty().Optimize()).ToHashSet();
                }

                if (set.Any(e => e != Empty.Instance && e.CanBeEmpty()))
                {
                    set = set.Where(e => e != Empty.Instance).ToHashSet();
                }

                IList <Expression> list = set.ToList();

                for (int i = 0; i < list.Count; i++)
                {
                    for (int j = 0; j < list.Count; j++)
                    {
                        if (i != j && IsASuperSetOfB(list[i], list[j]))
                        {
                            list.RemoveAt(j);
                            j--;

                            if (i > j)
                            {
                                i--;
                            }

                            somethingChanged = true;
                        }
                    }
                }

                for (int i = 0; i < list.Count; i++)
                {
                    for (int j = 0; j < list.Count; j++)
                    {
                        if (i != j)
                        {
                            Expression expression = ExtractFromBrackets(list[i], list[j]);

                            if (expression != null)
                            {
                                list.RemoveAt(j);

                                if (i > j)
                                {
                                    i--;
                                }

                                list.RemoveAt(i);

                                list.Add(expression);

                                j--;

                                somethingChanged = true;
                            }
                        }
                    }
                }

                set = list.ToHashSet();
            } while (somethingChanged);

            return(UnionHelper.MakeExpression(set));
        }