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); } }