private static void TestFactorial() { var whileParser = new WhileParserGeneric(); var builder = new ParserBuilder <WhileTokenGeneric, WhileAST>(); var Parser = builder.BuildParser(whileParser, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement"); var program = @" ( r:=1; i:=1; while i < 11 do ("; //program += "\nprint \"r=\".r;\n"; program += "r := r * i;\n"; // program += "print \"r=\".r;\n"; // program += "print \"i=\".i;\n"; program += "i := i + 1 \n);\n"; program += "return r)\n"; for (int i = 0; i < 10; i++) { try { var result = Parser.Result.Parse(program); var interpreter = new Interpreter(); var context = interpreter.Interprete(result.Result); var compiler = new WhileCompiler(); var code = compiler.TranspileToCSharp(program); var f = compiler.CompileToFunction(program); int r = f(); if (r != 3628800) { throw new Exception("erreur " + r); } } catch (Exception e) { ; } } }
static void testGenericLexerWhile() { var sw = new Stopwatch(); string source = @" ( r:=1; i:=1; while i < 11 DO ( r := r * i; PRINT r; print i; i := i + 1 ) )"; sw.Reset(); sw.Start(); WhileParserGeneric wpg = new WhileParserGeneric(); ParserBuilder <WhileTokenGeneric, WhileAST> wbuilderGen = new ParserBuilder <WhileTokenGeneric, WhileAST>(); var buildResultgen = wbuilderGen.BuildParser(wpg, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement"); var parserGen = buildResultgen.Result; var rGen = parserGen.Parse(source); sw.Stop(); Console.WriteLine($"generic parser : {sw.ElapsedMilliseconds} ms"); if (!rGen.IsError) { var interpreter = new Interpreter(); var ctx = interpreter.Interprete(rGen.Result); ; } else { rGen.Errors.ForEach(e => Console.WriteLine(e.ToString())); } ; }
private static void TestThreadsafeGeneric() { var whileParser = new WhileParserGeneric(); var builder = new ParserBuilder <WhileTokenGeneric, WhileAST>(); var Parser = builder.BuildParser(whileParser, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement"); var program = @" ( r:=1; i:=1; while i < 11 do ("; program += "r := r * i;\n"; program += "i := i + 1 \n);\n"; program += "return r)\n"; for (int i = 0; i < 10; i++) { int fixed_i = i; // capture fixed i var t = new Thread(() => { try { for (int j = 0; j < 10; j++) { Console.WriteLine($"{fixed_i}.{j}"); Thread.Sleep(5); Parser.Result.Parse(program); } } catch (Exception e) { ; } }); t.Start(); Console.WriteLine($"thread #{fixed_i} started"); } }