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