예제 #1
0
        public Error[] Compile()
        {
            if (!compilationTurnedOn)
            {
                return(new Error[] {
                    new Error("Uncompiled program.")
                });
            }

            //D.Log("Compiling " + this.ToString());

            StopAndReset();

            //_sprakRunner = new SprakRunner(new StringReader(sourceCodeContent), FunctionDefinitions.ToArray(), VariableDefinitions.ToArray());

            if (_sprakRunner == null)
            {
                //D.Log("Creating new SprakRunner for " + this.ToString());
                _sprakRunner = new SprakRunner(new StringReader(sourceCodeContent), FunctionDefinitions.ToArray(), VariableDefinitions.ToArray());
            }
            else
            {
                _sprakRunner.Reset();
            }

            PrintErrorsToD();
            return(GetErrors());
        }
예제 #2
0
        static void Main(string[] args)
        {
            string filename = "";             //"../Program1";

            if (args.Length > 0)
            {
                filename = args [0];
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("No program file given");
                return;
            }

            TextReader tr = File.OpenText(filename);

            //StringReader programString = new StringReader("g()\nfloat g() {\n	print(42)\n }");

            FunctionDefinition[] functionDefinitions = new FunctionDefinition[] {
                new FunctionDefinition("void", "print", new string[] { "string" }, new string[] { "text" }, print, FunctionDocumentation.Default())
            };

            SprakRunner runner = new SprakRunner(tr, functionDefinitions);

            runner.run(int.MaxValue);
        }
예제 #3
0
        public void SetVariableFromOutsideProgram()
        {
            s_output = new List <string>();
            TextReader programString = File.OpenText("code50.txt");

            // print(MAGIC_NUMBER)

            FunctionDefinition[] funcs = new FunctionDefinition[1];
            funcs[0] = new FunctionDefinition("void",
                                              "print",
                                              new string[] { "string" },
                                              new string[] { "text" },
                                              new ExternalFunctionCreator.OnFunctionCall(print),
                                              FunctionDocumentation.Default()
                                              );

            VariableDefinition[] vars = new VariableDefinition[3];
            vars[0] = new VariableDefinition("MAGIC_NUMBER", new ReturnValue(43));
            vars[1] = new VariableDefinition("MAGIC_BOOL", new ReturnValue(true));
            vars[2] = new VariableDefinition("MAGIC_STRING", new ReturnValue("hej"));

            SprakRunner program = new SprakRunner(programString, funcs, vars);

            program.run();

            Assert.AreEqual(0, program.getRuntimeErrorHandler().getErrors().Count);
            Assert.AreEqual("43", s_output[0]);
            Assert.AreEqual("true", s_output[1]);
            Assert.AreEqual("hej", s_output[2]);
        }
예제 #4
0
        public void ArrayAsArgumentListTest()
        {
            DemoClassThree dc3 = new DemoClassThree();

            FunctionDefinition[] defs = FunctionDefinitionCreator.CreateDefinitions(dc3, typeof(DemoClassThree));
            Assert.AreEqual(1, defs.Length);

            List <FunctionDefinition> moreFunctionDefinitions = new List <FunctionDefinition> {
                GetPrintFunction()
            };

            moreFunctionDefinitions.AddRange(defs);

            TextReader  programString = File.OpenText("code75.txt");
            SprakRunner program       = new SprakRunner(programString, moreFunctionDefinitions.ToArray());

            program.run();

            foreach (var e in program.getRuntimeErrorHandler().getErrors())
            {
                Console.WriteLine(e);
            }

            foreach (var e in program.getCompileTimeErrorHandler().getErrors())
            {
                Console.WriteLine(e);
            }

            Assert.AreEqual(0, program.getRuntimeErrorHandler().getErrors().Count);
            Assert.AreEqual(0, program.getCompileTimeErrorHandler().getErrors().Count);
        }
예제 #5
0
 void DeleteSprakRunner()
 {
     if (_sprakRunner != null)
     {
         _sprakRunner.HardReset();
     }
     _sprakRunner = null;
 }
예제 #6
0
        public void CallingFunctionWithWrongArgumentType_MANUAL_FUNCTION_DEFINITION()
        {
            TextReader programString = File.OpenText("code72.txt");

            FunctionDefinition[] functionDefinitions = new FunctionDefinition[] {
                new FunctionDefinition(
                    "number", "ThisFunctionTakesANumber",
                    new string[] { "number" }, new string[] { "x" },
                    ThisFunctionTakesANumber, FunctionDocumentation.Default()),

                GetPrintFunction()
            };

            SprakRunner program = new SprakRunner(programString, functionDefinitions);

            program.run();

            Assert.AreEqual(0, program.getCompileTimeErrorHandler().getErrors().Count);
        }
예제 #7
0
        public void CallingFunctionWithWrongArgumentType_USING_FUNCTION_DEFINITION_CREATOR()
        {
            TextReader programString = File.OpenText("code73.txt");

            ClassWithFunction c = new ClassWithFunction();

            FunctionDefinition[] funcDefs = FunctionDefinitionCreator.CreateDefinitions(c, typeof(ClassWithFunction));

            List <FunctionDefinition> moreFunctionDefinitions = new List <FunctionDefinition> {
                GetPrintFunction()
            };

            moreFunctionDefinitions.AddRange(funcDefs);

            SprakRunner program = new SprakRunner(programString, moreFunctionDefinitions.ToArray());

            program.run();

            Assert.AreEqual(0, program.getCompileTimeErrorHandler().getErrors().Count);
        }
예제 #8
0
        public void CallFunctionThatThrowsException()
        {
            DemoClassFour dc3 = new DemoClassFour();

            FunctionDefinition[] defs = FunctionDefinitionCreator.CreateDefinitions(dc3, typeof(DemoClassFour));
            Assert.AreEqual(1, defs.Length);

            List <FunctionDefinition> moreFunctionDefinitions = new List <FunctionDefinition> {
                GetPrintFunction()
            };

            moreFunctionDefinitions.AddRange(defs);

            TextReader  programString = File.OpenText("code77.txt");
            SprakRunner program       = new SprakRunner(programString, moreFunctionDefinitions.ToArray());

            program.run();

            Assert.AreEqual(0, program.getCompileTimeErrorHandler().getErrors().Count);
            Assert.AreEqual(1, program.getRuntimeErrorHandler().getErrors().Count);

            program.getRuntimeErrorHandler().printErrorsToConsole();
        }
예제 #9
0
        static void Main(string[] args)
        {
            string filename = "../Program1";

            if (args.Length > 0)
            {
                filename = args[0];
            }

            TextReader tr = File.OpenText(filename);

            //StringReader programString = new StringReader("g()\nfloat g() {\n	print(42)\n }");

            FunctionDefinition[] functionDefinitions = new FunctionDefinition[] {
                new FunctionDefinition("void", "print", new string[] { "string" }, new string[] { "text" }, print, FunctionDocumentation.Default())
            };

            SprakRunner runner  = new SprakRunner(tr, functionDefinitions);
            bool        success = runner.Start();

            if (success)
            {
                while (runner.Step() == InterpreterTwo.Status.OK)
                {
                }
            }

            Console.WriteLine("OUTPUT: ");
            foreach (string s in m_output)
            {
                Console.WriteLine(s);
            }

            //runner.printTree(true);

            //Console.In.ReadLine();
        }
예제 #10
0
        public void SetVariableFromOutsideProgram()
        {
            s_output = new List<string>();
            TextReader programString = File.OpenText("code50.txt");

            // print(MAGIC_NUMBER)

            FunctionDefinition[] funcs = new FunctionDefinition[1];
            funcs[0] = new FunctionDefinition("void",
                                              "print",
                                              new string[] { "string" },
                                              new string[] { "text" },
                                              new ExternalFunctionCreator.OnFunctionCall(print),
                                                FunctionDocumentation.Default()
            );

            VariableDefinition[] vars = new VariableDefinition[3];
            vars[0] = new VariableDefinition("MAGIC_NUMBER", new ReturnValue(43));
            vars[1] = new VariableDefinition("MAGIC_BOOL", new ReturnValue(true));
            vars[2] = new VariableDefinition("MAGIC_STRING", new ReturnValue("hej"));

            SprakRunner program = new SprakRunner(programString, funcs, vars);

            program.run();

            Assert.AreEqual(0, program.getRuntimeErrorHandler().getErrors().Count);
               	Assert.AreEqual("43", s_output[0]);
             	Assert.AreEqual("true", s_output[1]);
            Assert.AreEqual("hej", s_output[2]);
        }
예제 #11
0
        public void DotNotation()
        {
            s_output = new List<string> ();

            StringReader programString = new StringReader(
                @"var id = 100
                  id.foo(42, true)"
            );

            FunctionDefinition[] funcs = new FunctionDefinition[1];
            funcs[0] = new FunctionDefinition("void",
                "RemoteFunctionCall",
                new string[] { "number", "string", "array" },
                new string[] { "id", "functionName", "args" },
                new ExternalFunctionCreator.OnFunctionCall(ExternalFunctionCall),
                FunctionDocumentation.Default()
            );

            VariableDefinition[] vars = new VariableDefinition[] {};

            SprakRunner program = new SprakRunner(programString, funcs, vars);

            program.run();

            Assert.AreEqual (1, s_output.Count);
            Assert.AreEqual ("id = 100, functionName = foo, args = [42, true]", s_output[0]);
            Assert.AreEqual(0, program.getCompileTimeErrorHandler().getErrors().Count);
        }
예제 #12
0
        public void ComplexDotNotation()
        {
            s_output = new List<string> ();

            StringReader programString = new StringReader(
                @"var a = 10
                  number inc(number x)
                     return x + 5
                  end
                  (inc(a*a)).foo(inc(1), inc(2), [inc(3), inc(4)])"
            );

            FunctionDefinition[] funcs = new FunctionDefinition[1];
            funcs[0] = new FunctionDefinition("void",
                "RemoteFunctionCall",
                new string[] { "number", "string", "array" },
                new string[] { "id", "functionName", "args" },
                new ExternalFunctionCreator.OnFunctionCall(ExternalFunctionCall),
                FunctionDocumentation.Default()
            );

            VariableDefinition[] vars = new VariableDefinition[] {};

            SprakRunner program = new SprakRunner(programString, funcs, vars);

            program.run();

            Assert.AreEqual (1, s_output.Count);
            Assert.AreEqual ("id = 105, functionName = foo, args = [6, 7, [8, 9]]", s_output[0]);
            Assert.AreEqual(0, program.getCompileTimeErrorHandler().getErrors().Count);
        }