static void Main() { var test = "fubar bar 123 1foo bar -243 0"; Console.WriteLine("Lex: " + test); var prog = Lex.CompileLexerRegex(false, @"[A-Z_a-z][A-Z_a-z0-9]*", // id @"0|(\-?[1-9][0-9]*)", // int @"( |\t|\r|\n|\v|\f)" // space ); Console.WriteLine("Unoptimized dump:"); Console.WriteLine(Lex.Disassemble(prog)); Console.WriteLine(); var progOpt = Lex.CompileLexerRegex(true, @"[A-Z_a-z][A-Z_a-z0-9]*", // id @"0|(\-?[1-9][0-9]*)", // int @"( |\t|\r|\n|\v|\f)" // space ); Console.WriteLine("Optimized dump:"); Console.WriteLine(Lex.Disassemble(progOpt)); Console.WriteLine(); var progDfa = Lex.AssembleFrom(@"..\..\dfa.lasm"); Console.WriteLine("DFA dump:"); Console.WriteLine(Lex.Disassemble(progDfa)); Console.WriteLine(); for (var i = 0; i < 10; ++i) { Console.WriteLine("Pass #" + (i + 1)); Console.Write("NFA: "); Perf(prog, test); Console.Write("NFA+DFA (optimized): "); Perf(progOpt, test); Console.Write("DFA: "); Perf(progDfa, test); } }
static void Test() { var test = "switch case \"a\":L0001, case \"b\":L0002, default: L0004\r\n" + "L0001: char \"b\"\r\n" + "L0002: char \"c\"\r\n" + "L0003: match 1\r\n" + "L0004: any\r\n" + "L0005: match -1\r\n"; var prog = Lex.AssembleFrom(@"..\..\int.lasm"); //Console.WriteLine(Lex.Disassemble(prog)); var lc = LexContext.Create("1000"); //Console.WriteLine("{0}: {1}",Lex.Run(prog,lc),lc.GetCapture()); // //"((\\(['\\"abfnrtv0]|[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8}))|[^\\"])*" test = @"""((\\(['\\""abfnrtv0]|[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8}))|[^\\""])*"""; //Lex.RenderGraph(LexContext.Create(test),@"..\..\string_nfa.jpg"); prog = Lex.CompileRegexPart(test); prog = Lex.FinalizePart(prog); Console.WriteLine(Lex.Disassemble(prog)); test = "\"\\\"\\tHello World!\\\"\""; lc = LexContext.Create(test); if (-1 != Lex.RunWithLogging(prog, lc, Console.Error)) { Console.Write("Matched " + test + ": "); Console.WriteLine(lc.GetCapture()); } else { Console.Write("Matched " + test + ": "); Console.WriteLine("False - failed at position " + lc.Position); } return; _RunLexer(); }
static void _RunDump() { var prog = Lex.AssembleFrom(@"..\..\dump.lasm"); _RunLexer(prog); }
static void Main() { var test = "fubar bar 123 1foo bar -243 0 baz 83"; Console.WriteLine("Lex: " + test); var prog = Lex.CompileLexerRegex(false, @"[A-Z_a-z][A-Z_a-z0-9]*", // id @"0|(\-?[1-9][0-9]*)", // int @"( |\t|\r|\n|\v|\f)" // space ); Console.WriteLine("Unoptimized dump:"); Console.WriteLine(Lex.Disassemble(prog)); Console.WriteLine(); var progOpt = Lex.CompileLexerRegex(true, @"[A-Z_a-z][A-Z_a-z0-9]*", // id @"0|(\-?[1-9][0-9]*)", // int @"( |\t|\r|\n|\v|\f)" // space ); Console.WriteLine("Optimized dump:"); Console.WriteLine(Lex.Disassemble(progOpt)); Console.WriteLine(); var progDfa = Lex.AssembleFrom(@"..\..\dfa.lasm"); Console.WriteLine("DFA dump:"); Console.WriteLine(Lex.Disassemble(progDfa)); Console.WriteLine(); var nfa = FA.ToLexer(new FA[] { FA.Parse(@"[A-Z_a-z][A-Z_a-z0-9]*", 0), FA.Parse(@"0|(\-?[1-9][0-9]*)", 1), FA.Parse(@"( |\t|\r|\n|\v|\f)", 2) }); var dfa = nfa.ToDfa(); dfa.TrimDuplicates(); var dfaTable = dfa.ToDfaStateTable(); var result = -1; var count = 0f; var maxFiberCount = 0; var avgCharPasses = 0f; LexContext lc = LexContext.Create(test); while (LexContext.EndOfInput != lc.Current) { var stats = Lex.RunWithLoggingAndStatistics(prog, lc, TextWriter.Null, out result); maxFiberCount = stats.MaxFiberCount; if (stats.AverageCharacterPasses > avgCharPasses) { avgCharPasses = stats.AverageCharacterPasses; } ++count; } Console.WriteLine("NFA ran with " + maxFiberCount + " max fibers and " + avgCharPasses + " average char passes"); count = 0f; maxFiberCount = 0; avgCharPasses = 0f; count = 0; lc = LexContext.Create(test); while (LexContext.EndOfInput != lc.Current) { var stats = Lex.RunWithLoggingAndStatistics(progOpt, lc, TextWriter.Null, out result); maxFiberCount = stats.MaxFiberCount; if (stats.AverageCharacterPasses > avgCharPasses) { avgCharPasses = stats.AverageCharacterPasses; } ++count; } Console.WriteLine("NFA+DFA (optimized) ran with " + maxFiberCount + " max fibers and " + avgCharPasses + " average char passes"); count = 0; maxFiberCount = 0; avgCharPasses = 0f; lc = LexContext.Create(test); while (LexContext.EndOfInput != lc.Current) { var stats = Lex.RunWithLoggingAndStatistics(progDfa, lc, TextWriter.Null, out result); maxFiberCount = stats.MaxFiberCount; if (stats.AverageCharacterPasses > avgCharPasses) { avgCharPasses = stats.AverageCharacterPasses; } ++count; } Console.WriteLine("DFA ran with " + maxFiberCount + " max fibers and " + avgCharPasses + " average char passes"); #if RUNPERF for (var i = 0; i < 5; ++i) { test = string.Concat(test, test); } for (var i = 0; i < 10; ++i) { Console.WriteLine("Pass #" + (i + 1)); Console.Write("NFA: "); _Perf(prog, test); Console.WriteLine(); Console.Write("NFA+DFA (optimized): "); _Perf(progOpt, test); Console.WriteLine(); Console.Write("DFA: "); _Perf(progDfa, test); Console.WriteLine(); Console.Write("NFA (raw): "); _Perf(nfa, test); Console.WriteLine(); Console.Write("DFA (raw): "); _Perf(dfaTable, test); Console.WriteLine(); Console.WriteLine(); } Console.WriteLine(); #endif _RunLexer(progOpt); Console.Error.WriteLine(); }