Exemplo n.º 1
0
        private static MondProgram ParseAndCompile(IEnumerable <Token> lexer, MondCompilerOptions options)
        {
            var parser     = new Parser(lexer);
            var expression = parser.ParseAll();

            return(CompileImpl(expression, options));
        }
Exemplo n.º 2
0
        /// <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));
        }
Exemplo n.º 3
0
        /// <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));
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        public MondState()
        {
            _machine         = new Machine(this);
            _prototypeCache  = new Dictionary <string, MondValue>();
            _librariesLoaded = false;

            Options = new MondCompilerOptions();

            Libraries = new MondLibraryManager
            {
                new StandardLibraries()
            };
        }
Exemplo n.º 6
0
        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));
        }
Exemplo n.º 7
0
        /// <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));
        }
Exemplo n.º 8
0
        /// <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));
        }
Exemplo n.º 9
0
        /// <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));
        }
Exemplo n.º 10
0
        /// <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));
            }
        }
Exemplo n.º 11
0
        /// <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));
        }