示例#1
0
            public override int AddToNfa <TResult>(Nfa <TResult> nfa, int targetState)
            {
                if (choices.Length == 0)
                {
                    return(targetState);
                }

                if (choices.Length == 1)
                {
                    return(choices[0].AddToNfa(nfa, targetState));
                }

                var startState = nfa.AddState();

                var newChoices = new IMatchable[choices.Length - 1];

                Array.Copy(choices, newChoices, newChoices.Length);
                var pattern = new UnionPattern(newChoices);

                var endState = nfa.AddState();

                nfa.AddEpsilon(endState, targetState, NfaTransitionPriority.Low);
                nfa.AddEpsilon(startState, choices[choices.Length - 1].AddToNfa(nfa, endState));

                endState = nfa.AddState();
                nfa.AddEpsilon(endState, targetState);
                nfa.AddEpsilon(startState, pattern.AddToNfa(nfa, endState));

                return(startState);
            }
示例#2
0
            protected override Pattern CalcReverse()
            {
                var ret    = this;
                var newpat = new UnionPattern(choices);

                for (var i = 0; i < choices.Length; ++i)
                {
                    var old = newpat.choices[i];
                    var rev = old.Reversed;
                    // ReSharper disable once PossibleUnintendedReferenceComparison
                    if (old != rev)
                    {
                        newpat.choices[i] = rev;
                        ret = newpat;
                    }
                }

                return(ret);
            }