private static MondProgram ParseAndCompile(IEnumerable <Token> lexer, MondCompilerOptions options) { var parser = new Parser(lexer); var expression = parser.ParseAll(); return(CompileImpl(expression, options)); }
/// <summary> /// Load a Mond source code from a file and return the compiled program. /// </summary> /// <param name="path">Path to the file.</param> /// <param name="options">Compiler options.</param> public static MondProgram FromFile(string path, MondCompilerOptions options = null) { var source = File.ReadAllText(path, Encoding.UTF8); var name = Path.GetFileName(path); return(Compile(source, name, options)); }
/// <summary> /// Compile a Mond program from a string. /// </summary> /// <param name="source">Source code to compile</param> /// <param name="fileName">Optional file name to use in errors</param> /// <param name="options">Compiler options</param> public static MondProgram Compile(string source, string fileName = null, MondCompilerOptions options = null) { options = options ?? new MondCompilerOptions(); var lexer = new Lexer(source, fileName, options); var parser = new Parser(lexer); return(CompileImpl(parser.ParseAll(), options, source)); }
private static MondProgram CompileImpl(Expression expression, MondCompilerOptions options, string debugSourceCode = null) { expression = expression.Simplify(); expression.SetParent(null); //using (var printer = new ExpressionPrintVisitor(Console.Out)) // expression.Accept(printer); var compiler = new ExpressionCompiler(options); return(compiler.Compile(expression, debugSourceCode)); }
public MondState() { _machine = new Machine(this); _prototypeCache = new Dictionary <string, MondValue>(); _librariesLoaded = false; Options = new MondCompilerOptions(); Libraries = new MondLibraryManager { new StandardLibraries() }; }
private static MondProgram CompileImpl(Expression expression, MondCompilerOptions options) { options = options ?? new MondCompilerOptions(); expression.SetParent(null); expression.Simplify(); //using (var writer = new IndentTextWriter(Console.Out, " ")) // expression.Print(writer); var compiler = new ExpressionCompiler(options); return(compiler.Compile(expression)); }
/// <summary> /// Compiles a single statement from a stream of characters. This should /// only really be useful when implementing REPLs. /// </summary> /// <param name="source">Source code to compile</param> /// <param name="fileName">Optional file name to use in errors</param> /// <param name="options">Compiler options</param> public static MondProgram CompileStatement(IEnumerable <char> source, string fileName = null, MondCompilerOptions options = null) { var lexer = new Lexer(source, int.MaxValue, fileName); var parser = new Parser(lexer); var expression = new BlockExpression(new List <Expression> { parser.ParseStatement() }); return(CompileImpl(expression, options)); }
/// <summary> /// Compile a Mond program from a stream of characters. /// </summary> /// <param name="source">Source code to compile</param> /// <param name="fileName">Optional file name to use in errors</param> /// <param name="options">Compiler options</param> public static MondProgram Compile(IEnumerable <char> source, string fileName = null, MondCompilerOptions options = null) { var lexer = new Lexer(source, int.MaxValue, fileName); return(ParseAndCompile(lexer, options)); }
/// <summary> /// Compile a Mond program from a string. /// </summary> /// <param name="source">Source code to compile</param> /// <param name="fileName">Optional file name to use in errors</param> /// <param name="options">Compiler options</param> public static MondProgram Compile(string source, string fileName = null, MondCompilerOptions options = null) { var lexer = new Lexer(source, fileName); return(ParseAndCompile(lexer, options)); }
/// <summary> /// Compiles statements from an infinite stream of characters. /// This should only be useful when implementing REPLs. /// </summary> /// <param name="source">Source code to compile</param> /// <param name="fileName">Optional file name to use in errors</param> /// <param name="options">Compiler options</param> public static IEnumerable <MondProgram> CompileStatements(IEnumerable <char> source, string fileName = null, MondCompilerOptions options = null) { options = options ?? new MondCompilerOptions(); var needSource = options.DebugInfo == MondDebugInfoLevel.Full; var lexer = new Lexer(source, fileName, options, needSource); var parser = new Parser(lexer); while (true) { var expression = new BlockExpression(new[] { parser.ParseStatement() }); var sourceCode = lexer.SourceCode?.TrimStart('\r', '\n'); yield return(CompileImpl(expression, options, sourceCode)); } }
/// <summary> /// Compile a Mond program from a stream of characters. /// </summary> /// <param name="source">Source code to compile</param> /// <param name="fileName">Optional file name to use in errors</param> /// <param name="options">Compiler options</param> public static MondProgram Compile(IEnumerable <char> source, string fileName = null, MondCompilerOptions options = null) { options = options ?? new MondCompilerOptions(); var needSource = options.DebugInfo == MondDebugInfoLevel.Full; var lexer = new Lexer(source, fileName, options, needSource); var parser = new Parser(lexer); return(CompileImpl(parser.ParseAll(), options, lexer.SourceCode)); }