public void TestDotForDFA() { // Make sure it does not crash and does not return null. var dfa = DFA.Create(NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader("(a|b)+bcd"))))); string dotString = dfa.AsDotNotation(null); Assert.IsNotNull(dotString); }
public void Should_be_able_to_mark_the_last_step_as_active_for_DFA() { // Make sure it does not crash and does not return null. var dfa = DFA.Create(NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader("(a|b)+bcd"))))); string dotString = dfa.AsDotNotation("abc"); Assert.IsNotNull(dotString); Assert.IsTrue(dotString.Contains("4 [ fillcolor=\"green\" style=\"filled\"]")); }
/// <summary> /// Get the DFA and NFA graphs for a given regular expression and highlight active /// states for a given input string /// </summary> /// <param name="regex">Regular expression</param> /// <param name="input">Input string</param> /// <param name="minimize">Minimize the resulting DFA</param> /// <param name="nfaString">Dot notation NFA graph</param> /// <param name="dfaString">Dot notation DFA graph</param> public static void GetDfaAndNfaGraphs(string regex, string input, bool minimize, out string nfaString, out string dfaString) { var nfa = NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader(regex)))); nfaString = nfa.AsDotNotation(input, "NFA"); var dfa = DFA.Create(nfa); if (minimize) { dfa.Minimize(); } dfaString = dfa.AsDotNotation(input, "DFA"); }
public ILexer <T> CreateLexer() { // For each token, create a NFA IList <NFA> nfas = tokens.Select(token => NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader(token.Item1))))).ToList(); foreach (var ignoreExpr in ignore) { nfas.Add(NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader(ignoreExpr))))); } // Create a merged NFA NFA mergedNfa = NFA.Merge(nfas); // If we desire a NFA based lexer, stop now if (Runtime == LexerRuntime.Nfa) { return(new NfaLexer <T>(mergedNfa, nfas, tokens, EndOfInputTokenNumber)); } // Convert the NFA to a DFA DFA dfa = DFA.Create(mergedNfa); // Minimize the DFA if required dfa.Minimize(); // If we desire a DFA based lexer, stop if (Runtime == LexerRuntime.Dfa) { // TODO: // The input ranges which will have been previously split into the smallest distinct // units will need to be recombined in order for this to work as fast as possible. //dfa.CombineInputRanges(); return(new DfaLexer <T>(dfa, nfas, tokens, EndOfInputTokenNumber)); } // Convert the dfa to table form var transitionTable = new TransitionTable <T>(dfa, nfas, tokens); return(new TabularLexer <T>(transitionTable, EndOfInputTokenNumber)); }
private static DFA CreateDfa(string expression) { return(DFA.Create(NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader(expression)))))); }
public void TestOneOrMoreDFA() { NFA nfa = NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader("a+")))); DFA dfa = DFA.Create(nfa); }
public void TestCreateDFA2() { DFA dfa = DFA.Create(NfaBuilder.Create(new ShuntingYard(new RegExLexer(new StringReader("a|b|c"))))); }