Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
            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));
            }
Beispiel #3
0
            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));
            }
Beispiel #4
0
        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();
            }
        }