public void SubsetConstructionAlgorithmShouldConvertComplexNfaToDfa() { var a = new CharacterTerminal('a'); var b = new CharacterTerminal('b'); var c = new CharacterTerminal('c'); var states = CreateStates(4); states[0].AddTransistion(new TerminalNfaTransition(a, states[1])); states[0].AddTransistion(new TerminalNfaTransition(c, states[3])); states[1].AddTransistion(new NullNfaTransition(states[0])); states[1].AddTransistion(new TerminalNfaTransition(b, states[2])); states[2].AddTransistion(new TerminalNfaTransition(a, states[1])); states[3].AddTransistion(new TerminalNfaTransition(c, states[2])); states[3].AddTransistion(new NullNfaTransition(states[2])); var dfa_0 = ConvertNfaToDfa(new Nfa(states[0], states[2])); Assert.IsNotNull(dfa_0); IDfaTransition transition_0_01 = null; IDfaTransition transition_0_23 = null; var count = 0; foreach (var transition in dfa_0.Transitions) { var terminal = transition.Terminal; if (terminal.IsMatch('a')) { transition_0_01 = transition; } else if (terminal.IsMatch('c')) { transition_0_23 = transition; } count++; } Assert.AreEqual(2, count); var dfa_01 = transition_0_01.Target; IDfaTransition transition_01_01 = null; IDfaTransition transition_01_23 = null; IDfaTransition transition_01_2 = null; count = 0; foreach (var transition in dfa_01.Transitions) { var terminal = transition.Terminal; if (terminal.IsMatch('a')) { transition_01_01 = transition; } else if (terminal.IsMatch('b')) { transition_01_2 = transition; } else if (terminal.IsMatch('c')) { transition_01_23 = transition; } count++; } Assert.AreEqual(3, count); var dfa_23 = transition_0_23.Target; IDfaTransition transition_23_01 = null; IDfaTransition transition_23_2 = null; count = 0; foreach (var transition in dfa_23.Transitions) { var terminal = transition.Terminal; if (terminal.IsMatch('a')) { transition_23_01 = transition; } else if (terminal.IsMatch('c')) { transition_23_2 = transition; } count++; } Assert.AreEqual(2, count); var dfa_2 = transition_23_2.Target; IDfaTransition transition_2_01 = null; count = 0; foreach (var transition in dfa_2.Transitions) { var terminal = transition.Terminal; if (terminal.IsMatch('a')) { transition_2_01 = transition; } count++; } Assert.AreEqual(1, count); }
public void AddTransition(IDfaTransition edge) { _transitions.Add(edge); }