private static IEnumerable <Tuple <bool[], TLetter, bool[]> > GetPWSTransitionsWithLetter <TLetter>( int n, EpsilonDFA <int, TLetter> epsNFA, TLetter letter) { bool[][] reachable = new bool[n][]; for (int i = 0; i < n; i++) { var states = epsNFA.ReachableStates(i, letter); reachable[i] = new bool[n]; foreach (var endState in states) { reachable[i][endState] = true; } } foreach (var powerSet in AllStates(n)) { bool[] endPowerSet = new bool[n]; for (int i = 0; i < n; i++) { if (powerSet[i]) { for (int j = 0; j < n; j++) { endPowerSet[j] |= reachable[i][j];//So many things can go wrong here. } } } yield return(Tuple.Create(powerSet, letter, endPowerSet)); } }
public static EpsilonDFA <TState, TLetter> KleeneClosure( EpsilonDFA <TState, TLetter> toRepeat, Func <TState> getNewState) { var onlyNew = getNewState(); var epsilonTransitions = toRepeat.epsilonTransitions.Concat( Tuple.Create(onlyNew, toRepeat.startState), Tuple.Create(toRepeat.finalState, onlyNew)); return(new EpsilonDFA <TState, TLetter>(toRepeat.transitions, epsilonTransitions, onlyNew, onlyNew)); }
public static EpsilonDFA <TState, TLetter> Concatenation( EpsilonDFA <TState, TLetter> first, EpsilonDFA <TState, TLetter> second, Func <TState> getNewState) { var epsilonTransitions = first.epsilonTransitions.Concat( second.epsilonTransitions).Concat( Tuple.Create(first.finalState, second.startState)); var transitions = first.transitions.Concat(second.transitions); return(new EpsilonDFA <TState, TLetter>(transitions, epsilonTransitions, first.startState, second.finalState)); }
private static EpsilonDFA <TState, TLetter> GetNFA <TState, TLetter>( IRegExExpressionTree <TLetter> exp, Func <TState> getNewState) { switch (exp.Type) { case RegExNodeTypes.Letter: return(EpsilonDFA <TState, TLetter> .Letter( ((Letter <TLetter>)exp).LetterToMatch, getNewState)); case RegExNodeTypes.EmptyWord: return(EpsilonDFA <TState, TLetter> .EmptyWord(getNewState)); case RegExNodeTypes.Empty: return(EpsilonDFA <TState, TLetter> .Empty(getNewState)); case RegExNodeTypes.KleeneClosure: return(EpsilonDFA <TState, TLetter> .KleeneClosure( GetNFA(exp.GetChildren().First(), getNewState), getNewState)); case RegExNodeTypes.Choise: return(EpsilonDFA <TState, TLetter> .Choise( GetNFA(exp.GetChildren().First(), getNewState), GetNFA(exp.GetChildren().Last(), getNewState), getNewState)); case RegExNodeTypes.Concatenation: return(EpsilonDFA <TState, TLetter> .Concatenation( GetNFA(exp.GetChildren().First(), getNewState), GetNFA(exp.GetChildren().Last(), getNewState), getNewState)); default: throw new ArgumentException(); } }