protected virtual void GetReachableStates(RuleBinding rule, HashSet <State> states, bool trackIncoming) { if (states.Add(rule.StartState)) { GetReachableStates(rule.StartState, states, trackIncoming); } }
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); } } }
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)); }
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)); }
protected virtual void TryBindRule(RuleBinding ruleBinding, Nfa nfa) { Contract.Requires(ruleBinding != null); if (nfa == null) { return; } Nfa.BindRule(ruleBinding, nfa); }
protected virtual void TryBindRule([NotNull] RuleBinding ruleBinding, Nfa nfa) { Debug.Assert(ruleBinding != null); if (nfa == null) { return; } Nfa.BindRule(ruleBinding, nfa); }
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); } }