Пример #1
0
        internal static NfaEdge Create(char min, char max)
        {
            int int_min = (int)min;
            int int_max = (int)max;
            int n       = -1;
            int x       = -1;

            for (int i = 0; i < codePointRanges.Length; ++i)
            {
                if (codePointRanges[i].Item1 <= int_min && int_min <= codePointRanges[i].Item2)
                {
                    n = i;
                }
                if (codePointRanges[i].Item1 <= int_max && int_max <= codePointRanges[i].Item2)
                {
                    x = i;
                }
            }

            var ranges = new List <Tuple <int, int> >();

            // from biggest to smallest -- it creates fibers from longest to shortest
            // important to create multi-edge with merged tails
            for (int i = x; i >= n; --i)
            {
                Tuple <int, int> tuple = codePointRanges[i];
                if (i == n)
                {
                    tuple = Tuple.Create(int_min, tuple.Item2);
                }
                if (i == x)
                {
                    tuple = Tuple.Create(tuple.Item1, int_max);
                }

                ranges.Add(tuple);
            }

            return(new NfaEdge(ranges.Select(it => Fiber.CreateChain(it))));
        }