コード例 #1
0
ファイル: NFA.cs プロジェクト: pms-search/FST
 public void AddTransition(int from, int to, CharRange c)
 {
     if (!transitions.Any(t => t.Item1 == from && t.Item2 == to && t.Item3.Equals(c)))
     {
         transitions.Add(new ValueTuple <int, int, CharRange>(from, to, c));
     }
 }
コード例 #2
0
ファイル: CharRange.cs プロジェクト: PetroProtsyk/FST
        public static IEnumerable <CharRange> Disjoin(this IEnumerable <CharRange> ranges)
        {
            var pqueue = new SortedSet <CharRange>(ranges, Comparer <CharRange> .Create((x, y) =>
            {
                if (x.start == y.start)
                {
                    return(y.end - x.end);
                }
                return(y.start - x.start);
            }));


            while (pqueue.Count > 1)
            {
                var current = pqueue.Max;
                pqueue.Remove(current);

                var next = pqueue.Max;
                if (current.end == next.start)
                {
                    pqueue.Remove(next);

                    if (current.start <= current.end - 1)
                    {
                        pqueue.Add(new CharRange(current.start, current.end - 1));
                    }

                    pqueue.Add(new CharRange(next.start, next.start));

                    if (next.start + 1 <= next.end)
                    {
                        pqueue.Add(new CharRange(next.start + 1, next.end));
                    }
                }
                else if (current.end > next.start)
                {
                    pqueue.Remove(next);

                    if (current.start < next.start)
                    {
                        var first = new CharRange(current.start, next.start - 1);
                        pqueue.Add(first);
                    }

                    var firstEnd = Math.Min(current.end, next.end);
                    var lastEnd  = Math.Max(current.end, next.end);

                    if (next.start <= firstEnd)
                    {
                        var second = new CharRange(next.start, firstEnd);
                        pqueue.Add(second);
                    }

                    if (firstEnd + 1 < lastEnd)
                    {
                        var third = new CharRange(firstEnd + 1, lastEnd);
                        pqueue.Add(third);
                    }
                }
                else
                {
                    yield return(current);
                }
            }

            if (pqueue.Count > 0)
            {
                yield return(pqueue.Max);
            }
        }
コード例 #3
0
ファイル: DFA.cs プロジェクト: pms-search/FST
 public void AddTransition(int from, int to, CharRange c)
 {
     transitions[from].Add(new ValueTuple <CharRange, int>(c, to));
 }