private static void TestFactorial() { var whileParser = new WhileParser(); var builder = new ParserBuilder <WhileToken, 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"; 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); ; }
public WhileCompiler() { var parser = new WhileParser(); var builder = new ParserBuilder <WhileToken, WhileAST>(); var whileParserBuildResult = builder.BuildParser(parser, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement"); whileParser = whileParserBuildResult.Result; }
public BuildResult <Parser <WhileToken, WhileAST> > buildParser() { if (Parser == null) { var whileParser = new WhileParser(); var builder = new ParserBuilder <WhileToken, WhileAST>(); Parser = builder.BuildParser(whileParser, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement"); } return(Parser); }
public static bool Parse(SyntaxContext context, int position) { var list = context.list; var offset = 0; var index = position; var count = 0; var isMissed = false; count = 0; while (true) { while (ReturnParser.Parse(context, index)) { ; } while (BreakParser.Parse(context, index)) { ; } while (DoParser.Parse(context, index)) { ; } while (WhileParser.Parse(context, index)) { ; } while (ForNParser.Parse(context, index)) { ; } while (ForParser.Parse(context, index)) { ; } while (ForEachParser.Parse(context, index)) { ; } while (FunctionNParser.Parse(context, index)) { ; } while (FunctionSParser.Parse(context, index)) { ; } while (IfParser.Parse(context, index)) { ; } while (IfElseParser.Parse(context, index)) { ; } while (DefineNParser.Parse(context, index)) { ; } while (CallParser.Parse(context, index)) { ; } while (BindParser.Parse(context, index)) { ; } while (BindNParser.Parse(context, index)) { ; } if (context.isMissed) { context.isMissed = false; offset += 1; index = position + offset; count += 1; break; } if (!list[index].isStatement) { break; } else { // ignored } offset += 1; index = position + offset; count += 1; } if (count == 0) { return(false); } context.Insert(position, ExpressionCreator.CreateModule(list, position, offset)); context.Remove(position + 1, offset); return(true); }