示例#1
0
        private string Compile(List <Stmt> statements)
        {
            //RoslynGenerate roslynGenerate = new();

            // Don't turn on until ready to emit Roslyn.
            // roslynGenerate.Generate(statements);

            var      interpreter = new Interpreter.JukaInterpreter(serviceProvider);
            Resolver?resolver    = new(interpreter);

            resolver.Resolve(statements);

            var currentOut = Console.Out;


            // Action<Interpreter.Interpreter, List<Stmt>> wrap;

            using (StringWriter stringWriter = new StringWriter())
            {
                Console.SetOut(stringWriter);
                interpreter.Interpert(statements);

                String ConsoleOutput = stringWriter.ToString();
                Console.SetOut(currentOut);

                return(ConsoleOutput);
            }
        }
示例#2
0
文件: Resolver.cs 项目: jukaLang/Juka
        internal Resolver(JukaInterpreter interpreter)
        {
            this.interpreter = interpreter;

            this.ServiceProvider = interpreter.ServiceProvider;
            if (this.ServiceProvider != null)
            {
                this.compilerError = this.ServiceProvider?.GetService <ICompilerError>();
            }
        }
示例#3
0
        public object Call(JukaInterpreter interpreter, List <object> arguments)
        {
            JukaEnvironment environment = new(closure);

            for (int i = 0; i < declaration.Params.Count; i++)
            {
                string?name = declaration.Params[i].parameterName.ToString();
                if (string.IsNullOrEmpty(name))
                {
                    throw new ArgumentException("unable to call function");
                }
                object value = arguments[i];
                environment.Define(name, value);
            }

            try
            {
                interpreter.ExecuteBlock(declaration.body, environment);
            }
            catch (Return ex)
            {
                if (isInitializer)
                {
                    return(closure.GetAt(0, "this"));
                }

                return(ex.value);
            }

            if (isInitializer)
            {
                return(closure.GetAt(0, "this"));
            }

            return(null);
        }