public override Regexp Normalize()
        {
            var disj = GetDisjuncts();

            disj.Sort();
            Regexp re = null;

            foreach (var d in disj)
            {
                if (re == null)
                {
                    re = d.Normalize();
                }
                else
                {
                    re = new REUnion(d.Normalize(), re);
                }
            }

            if (re.GetDisjuncts().Count == disj.Count)
            {
                return(re);
            }
            else
            {
                return(re.Normalize());
            }
        }
        public override Regexp Normalize()
        {
            var r1 = r.Normalize();

            Regexp dj = null;

            foreach (var d in r1.GetDisjuncts())
            {
                Regexp sol = null;
                if (!(d is REStar) && !(d is REPlus) && !(d is REQMark))
                {
                    sol = d;
                }
                else
                {
                    if (d is REStar)
                    {
                        var v = d as REStar;
                        sol = v.r;
                    }
                    else
                    {
                        if (d is REPlus)
                        {
                            var v = d as REPlus;
                            sol = v.r;
                        }
                        else
                        {
                            var v = d as REQMark;
                            sol = v.r;
                        }
                    }
                }
                if (dj == null)
                {
                    dj = sol;
                }
                else
                {
                    dj = new REUnion(sol, dj);
                }
            }
            if (dj.GetDisjuncts().Count != r.GetDisjuncts().Count)
            {
                return(new REStar(dj).Normalize());
            }

            return(new REStar(dj));
        }