コード例 #1
0
        public override StateRange AddTo <T>(NFA <T> nfa, CodePointEquivalenceClasses equivalenceClasses)
        {
            var startState = nfa.AddState();
            var endState   = nfa.AddState();

            foreach (var states in Expressions.Select(exp => exp.AddTo(nfa, equivalenceClasses)))
            {
                nfa.AddEpsilonTransition(startState, states.Start);
                nfa.AddEpsilonTransition(states.End, endState);
            }
            return(new StateRange(startState, endState));
        }
コード例 #2
0
 public override StateRange AddTo <T>(NFA <T> nfa, CodePointEquivalenceClasses equivalenceClasses)
 {
     return(Expressions.Select(exp => exp.AddTo(nfa, equivalenceClasses)).Aggregate((states1, states2) =>
     {
         nfa.AddEpsilonTransition(states1.End, states2.Start);
         return new StateRange(states1.End, states2.Start);
     }));
 }
コード例 #3
0
        public override StateRange AddTo <T>(NFA <T> nfa, CodePointEquivalenceClasses equivalenceClasses)
        {
            var reps = AddReps(nfa, equivalenceClasses).ToList();

            if (MaxRepititions == null)
            {
                // Repeat last rep as many times as needed
                var lastRep = reps.Last();
                nfa.AddEpsilonTransition(lastRep.End, lastRep.Start);
            }

            return(reps.Aggregate((states1, states2) =>
            {
                nfa.AddEpsilonTransition(states1.End, states2.Start);
                return new StateRange(states1.Start, states2.End);
            }));
        }
コード例 #4
0
        public override StateRange AddTo <T>(NFA <T> nfa, CodePointEquivalenceClasses equivalenceClasses)
        {
            // Create a separate NFA
            var tempNFA = new NFA <State?>(equivalenceClasses.Count);
            var states  = Expression.AddTo(tempNFA, equivalenceClasses);

            tempNFA.SetStart(states.Start);
            tempNFA.SetFinal(states.End);

            // Convert to a DFA
            var dfa = tempNFA.ToDFA(stateData => null).Item2;

            dfa = dfa.Minimize().Item2;
            dfa.MakeComplete();             // Can only do complement on complete DFA

            // Now add the complement to this nfa
            var startState = nfa.AddState();
            var endState   = nfa.AddState();

            foreach (var dfaState in dfa.States)
            {
                var nfaState = GetMatchingState(nfa, dfa, dfaState);
                if (dfa.IsStart(dfaState))
                {
                    nfa.AddEpsilonTransition(startState, nfaState);
                }
                if (!dfa.IsFinal(dfaState))
                {
                    nfa.AddEpsilonTransition(nfaState, endState);
                }
                // Copy transitions
                foreach (var input in nfa.Inputs)
                {
                    var toDFAState = dfa.GetTransition(dfaState, input);
                    if (toDFAState != null)
                    {
                        var toNFAState = GetMatchingState(nfa, dfa, toDFAState.Value);
                        nfa.AddTransition(nfaState, input, toNFAState);
                    }
                }
            }

            return(new StateRange(startState, endState));
        }
コード例 #5
0
        public void AddStates(IDictionary<Mode, State> modeMap, CodePointEquivalenceClasses equivalenceClasses, NFA<LexerAction> nfa, int priority, Channel defaultChannel)
        {
            var states = Expression.AddTo(nfa, equivalenceClasses);

            foreach(var mode in Modes)
                nfa.AddEpsilonTransition(modeMap[mode], states.Start);

            nfa.SetFinal(states.End);

            // Set Action
            nfa.SetData(states.End, new LexerAction(priority, GetValueAction(), GetModeActions(), GetEmitAction(defaultChannel), GetCodeAction()));
        }
コード例 #6
0
        public void AddStates(IDictionary <Mode, State> modeMap, CodePointEquivalenceClasses equivalenceClasses, NFA <LexerAction> nfa, int priority, Channel defaultChannel)
        {
            var states = Expression.AddTo(nfa, equivalenceClasses);

            foreach (var mode in Modes)
            {
                nfa.AddEpsilonTransition(modeMap[mode], states.Start);
            }

            nfa.SetFinal(states.End);

            // Set Action
            nfa.SetData(states.End, new LexerAction(priority, GetValueAction(), GetModeActions(), GetEmitAction(defaultChannel), GetCodeAction()));
        }
コード例 #7
0
        private IEnumerable <StateRange> AddReps <T>(NFA <T> nfa, CodePointEquivalenceClasses equivalenceClasses)
        {
            // Add required reps
            for (var i = 0; i < MinRepititions; i++)
            {
                yield return(Expression.AddTo(nfa, equivalenceClasses));
            }

            // Add optional reps
            // If min=0 and max=*, then we want to make one optional rep to use for the * hence `MaxRepititions ?? 1`
            var optionalReps = (MaxRepititions ?? 1) - MinRepititions;

            for (var i = 0; i < optionalReps; i++)
            {
                var states = Expression.AddTo(nfa, equivalenceClasses);
                // Can skip these reps
                nfa.AddEpsilonTransition(states.Start, states.End);
                yield return(states);
            }
        }