Exemplo n.º 1
0
        public override void Compile(ICompiler cmp, bool reverse)
        {
            IntervalCollection metaCollection = intervals.GetMetaCollection(GetIntervalCost);
            int num = metaCollection.Count;

            for (int i = 0; i < pos_cats.Length; i++)
            {
                if (pos_cats[i] || neg_cats[i])
                {
                    num++;
                }
            }
            if (num == 0)
            {
                return;
            }
            LinkRef linkRef = cmp.NewLink();

            if (num > 1)
            {
                cmp.EmitIn(linkRef);
            }
            foreach (Interval item in metaCollection)
            {
                Interval interval = item;
                if (interval.IsDiscontiguous)
                {
                    BitArray bitArray = new BitArray(interval.Size);
                    foreach (Interval interval2 in intervals)
                    {
                        Interval i2 = interval2;
                        if (interval.Contains(i2))
                        {
                            for (int j = i2.low; j <= i2.high; j++)
                            {
                                bitArray[j - interval.low] = true;
                            }
                        }
                    }
                    cmp.EmitSet((char)interval.low, bitArray, negate, ignore, reverse);
                }
                else if (interval.IsSingleton)
                {
                    cmp.EmitCharacter((char)interval.low, negate, ignore, reverse);
                }
                else
                {
                    cmp.EmitRange((char)interval.low, (char)interval.high, negate, ignore, reverse);
                }
            }
            for (int k = 0; k < pos_cats.Length; k++)
            {
                if (pos_cats[k])
                {
                    if (neg_cats[k])
                    {
                        cmp.EmitCategory(Category.AnySingleline, negate, reverse);
                    }
                    else
                    {
                        cmp.EmitCategory((Category)k, negate, reverse);
                    }
                }
                else if (neg_cats[k])
                {
                    cmp.EmitNotCategory((Category)k, negate, reverse);
                }
            }
            if (num > 1)
            {
                if (negate)
                {
                    cmp.EmitTrue();
                }
                else
                {
                    cmp.EmitFalse();
                }
                cmp.ResolveLink(linkRef);
            }
        }