Exemplo n.º 1
0
 protected virtual void GetReachableStates(RuleBinding rule, HashSet <State> states, bool trackIncoming)
 {
     if (states.Add(rule.StartState))
     {
         GetReachableStates(rule.StartState, states, trackIncoming);
     }
 }
Exemplo n.º 2
0
        protected virtual void GetRuleStates(StateOptimizer optimizer, RuleBinding ruleName, State state, Dictionary <int, RuleBinding> stateRules)
        {
            if (stateRules.ContainsKey(state.Id))
            {
                return;
            }

            stateRules[state.Id] = ruleName;

            foreach (var transition in state.OutgoingTransitions)
            {
                if (transition is PopContextTransition)
                {
                    continue;
                }

                PushContextTransition contextTransition = transition as PushContextTransition;
                if (contextTransition != null)
                {
                    foreach (var popTransition in optimizer.GetPopContextTransitions(contextTransition))
                    {
                        GetRuleStates(optimizer, ruleName, popTransition.TargetState, stateRules);
                    }
                }
                else
                {
                    GetRuleStates(optimizer, ruleName, transition.TargetState, stateRules);
                }
            }
        }
Exemplo n.º 3
0
        public static void BindRule(RuleBinding ruleBinding, Nfa body)
        {
            Contract.Requires <ArgumentNullException>(ruleBinding != null, "ruleBinding");
            Contract.Requires <ArgumentNullException>(body != null, "body");

            ruleBinding.StartState.AddTransition(new EpsilonTransition(body.StartState));
            body.EndState.AddTransition(new EpsilonTransition(ruleBinding.EndState));
        }
Exemplo n.º 4
0
        public static void BindRule([NotNull] RuleBinding ruleBinding, [NotNull] Nfa body)
        {
            Requires.NotNull(ruleBinding, nameof(ruleBinding));
            Requires.NotNull(body, nameof(body));

            ruleBinding.StartState.AddTransition(new EpsilonTransition(body.StartState));
            body.EndState.AddTransition(new EpsilonTransition(ruleBinding.EndState));
        }
Exemplo n.º 5
0
        protected virtual void TryBindRule(RuleBinding ruleBinding, Nfa nfa)
        {
            Contract.Requires(ruleBinding != null);
            if (nfa == null)
            {
                return;
            }

            Nfa.BindRule(ruleBinding, nfa);
        }
Exemplo n.º 6
0
        protected virtual void TryBindRule([NotNull] RuleBinding ruleBinding, Nfa nfa)
        {
            Debug.Assert(ruleBinding != null);
            if (nfa == null)
            {
                return;
            }

            Nfa.BindRule(ruleBinding, nfa);
        }
Exemplo n.º 7
0
        public static Nfa Rule(RuleBinding ruleBinding)
        {
            State startState = new State();
            State endState   = new State();

            PushContextTransition push = new PushContextTransition(ruleBinding.StartState, startState.Id);
            PopContextTransition  pop  = new PopContextTransition(endState, startState.Id);

            startState.AddTransition(push);
            ruleBinding.EndState.AddTransition(pop);

            return(new Nfa(startState, endState));
        }
        private static void ExtractStatesAndTransitions(StateOptimizer optimizer, RuleBinding currentRule, State currentState, HashSet <State> states, HashSet <Transition> transitions, Dictionary <int, RuleBinding> stateRules, Dictionary <int, RuleBinding> contextRules)
        {
            if (!states.Add(currentState))
            {
                return;
            }

            currentRule = currentRule ?? stateRules[currentState.Id];

            foreach (var transition in currentState.OutgoingTransitions)
            {
                transitions.Add(transition);
                var nextRule = transition.IsContext ? null : currentRule;
                ExtractStatesAndTransitions(optimizer, nextRule, transition.TargetState, states, transitions, stateRules, contextRules);

//                if (transitions.Add(transition))
//                {
//                    if (transition.IsContext)
//                    {
//                        PushContextTransition pushContext = transition as PushContextTransition;
//                        if (pushContext != null)
//                        {
//                            foreach (var popTransition in optimizer.GetPopContextTransitions(pushContext))
//                            {
//                                // the matching pop transitions should always end in this rule
//                                Contract.Assert(popTransition.ContextIdentifiers.Last() == pushContext.ContextIdentifiers.First());
//#if ALL_CHECKS
//                                // matching is symmetric
//                                Contract.Assert(popTransition.PushTransitions.Contains(pushContext));
//#endif
//                                // make sure there are no "matching" transitions which were removed by a call to State.RemoveTransition
//                                Contract.Assert(popTransition.SourceState != null);

//                                ExtractStatesAndTransitions(optimizer, currentRule, popTransition.TargetState, states, transitions, stateRules, contextRules);
//                            }

//                            ExtractStatesAndTransitions(optimizer, null, transition.TargetState, states, transitions, stateRules, contextRules);
//                            continue;
//                        }

//                        PopContextTransition popContext = transition as PopContextTransition;
//                        if (popContext != null)
//                        {
//                            foreach (var pushTransition in optimizer.GetPushContextTransitions(popContext))
//                            {
//                                // the matching push transitions should always start in this rule
//                                Contract.Assert(pushTransition.ContextIdentifiers.First() == popContext.ContextIdentifiers.Last());
//#if ALL_CHECKS
//                                // matching is symmetric
//                                Contract.Assert(pushTransition.PopTransitions.Contains(popContext));
//#endif
//                                // make sure there are no "matching" transitions which were removed by a call to State.RemoveTransition
//                                Contract.Assert(pushTransition.SourceState != null);
//                            }

//                            ExtractStatesAndTransitions(optimizer, null, transition.TargetState, states, transitions, stateRules, contextRules);
//                            continue;
//                        }

//                        throw new InvalidOperationException("Unrecognized context transition.");
//                    }
//                    else
//                    {
//                        ExtractStatesAndTransitions(optimizer, currentRule, transition.TargetState, states, transitions, stateRules, contextRules);
//                    }
//                }
            }

            foreach (var transition in currentState.IncomingTransitions)
            {
                transitions.Add(transition);
                var nextRule = transition.IsContext ? null : currentRule;
                ExtractStatesAndTransitions(optimizer, nextRule, transition.SourceState, states, transitions, stateRules, contextRules);
            }
        }