Exemplo n.º 1
0
        public void Function_main_hello_world()
        {
            theString = null;
            var lexer       = new XzaarScriptLexer();
            var parser      = new XzaarScriptParser();
            var transformer = new XzaarScriptTransformer();
            var compiler    = new DotNetXzaarScriptCompiler();



            var tokens = lexer.Tokenize("extern fn println(string text);" +
                                        "fn main() { println(\"hello world \" + 24); }"); //
            var ast0 = parser.Parse(tokens);
            var ast1 = transformer.Transform(ast0);

            compiler.RegisterExternFunction("println", this.GetType().GetMethod("WriteToString", new[] { typeof(string) }), XzaarScope.Global); // typeof(Console) ... WriteLine

            var expression = compiler.Compile(ast1) as LambdaXzaarCompiledScript;

            var lambdaExpression = expression.GetLambdaExpression();

            // since we return one function, our output will be an Action (extern ones are not included)

            var result = expression.Invoke <Action>();

            if (result != null)
            {
                result();
            }

            Assert.AreEqual("hello world 24", theString);
            Assert.AreNotEqual(null, lambdaExpression);
        }
Exemplo n.º 2
0
        public void LexerTest_a_minusminus()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("a--");

            Assert.AreEqual("a", tokens[0].Value);
            Assert.AreEqual("--", tokens[1].Value);
        }
Exemplo n.º 3
0
        public void LexerTest_a_plusplus()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("a++");

            Assert.AreEqual("a", tokens[0].Value);
            Assert.AreEqual("++", tokens[1].Value);
        }
Exemplo n.º 4
0
        public void LexerTest_string_inside_string()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("hello = \"w\\\"o\\\"rld\"");

            Assert.AreEqual("hello", tokens[0].Value);
            Assert.AreEqual("=", tokens[1].Value);
            Assert.AreEqual("w\"o\"rld", tokens[2].Value);
        }
Exemplo n.º 5
0
        public void LexerTest_a_gt_b()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("a > b");

            Assert.AreEqual("a", tokens[0].Value);
            Assert.AreEqual(">", tokens[1].Value);
            Assert.AreEqual("b", tokens[2].Value);
        }
Exemplo n.º 6
0
        public void LexerTest_1_gt_0()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("1 > 0");

            Assert.AreEqual("1", tokens[0].Value);
            Assert.AreEqual(">", tokens[1].Value);
            Assert.AreEqual("0", tokens[2].Value);
        }
Exemplo n.º 7
0
        public void LexerTest_minus1_lt_0()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("-1 < 0");

            Assert.AreEqual("-1", tokens[0].Value);
            Assert.AreEqual("<", tokens[1].Value);
            Assert.AreEqual("0", tokens[2].Value);
        }
Exemplo n.º 8
0
        public void LexerTest_quoute_inside_quoute()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("hello = 'w\\'o\\'rld'");

            Assert.AreEqual("hello", tokens[0].Value);
            Assert.AreEqual("=", tokens[1].Value);
            Assert.AreEqual("w'o'rld", tokens[2].Value);
        }
Exemplo n.º 9
0
        public void LexerTest_a_equals_decimal()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("a = 10.0");

            Assert.AreEqual("a", tokens[0].Value);
            Assert.AreEqual("=", tokens[1].Value);
            Assert.AreEqual("10.0", tokens[2].Value);
        }
Exemplo n.º 10
0
        public void LexerTest_a_equals_string_1()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("hello = \"world\"");

            Assert.AreEqual("hello", tokens[0].Value);
            Assert.AreEqual("=", tokens[1].Value);
            Assert.AreEqual("world", tokens[2].Value);
        }
Exemplo n.º 11
0
        public void LexerTest_a_equals_decimal_number_and_accessor_0()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("a = 10.0.jaa");

            Assert.AreEqual("a", tokens[0].Value);
            Assert.AreEqual("=", tokens[1].Value);
            Assert.AreEqual("10.0", tokens[2].Value);
            Assert.AreEqual(".", tokens[3].Value);
            Assert.AreEqual("jaa", tokens[4].Value);
        }
Exemplo n.º 12
0
        private string FormatCode(string inputCode)
        {
            var tokens = new XzaarScriptLexer().Tokenize(inputCode);
            var ast    = new XzaarScriptParser().Parse(tokens);

            ast = new XzaarScriptTransformer().Transform(ast);
            var analyzer      = new XzaarExpressionAnalyzer();
            var analyzed      = analyzer.AnalyzeExpression(ast);
            var codeGenerator = new CodeGeneratorVisitor();

            return(codeGenerator.Visit(analyzed.GetExpression()));
        }
Exemplo n.º 13
0
        public void LexerTest_if_then()
        {
            var lexer  = new XzaarScriptLexer();
            var tokens = lexer.Tokenize("if (a == 0) { a = 3 }");

            Assert.AreEqual("if", tokens[0].Value);
            Assert.AreEqual("(", tokens[1].Value);
            Assert.AreEqual("a", tokens[2].Value);
            Assert.AreEqual("==", tokens[3].Value);
            Assert.AreEqual("0", tokens[4].Value);
            Assert.AreEqual(")", tokens[5].Value);
            Assert.AreEqual("{", tokens[6].Value);
            Assert.AreEqual("a", tokens[7].Value);
            Assert.AreEqual("=", tokens[8].Value);
            Assert.AreEqual("3", tokens[9].Value);
            Assert.AreEqual("}", tokens[10].Value);
        }
Exemplo n.º 14
0
        public void Compile_value_mul_10()
        {
            var lexer       = new XzaarScriptLexer();
            var parser      = new XzaarScriptParser();
            var transformer = new XzaarScriptTransformer();
            var compiler    = new DotNetXzaarScriptCompiler();
            var tokens      = lexer.Tokenize("apa * 10");
            var ast0        = parser.Parse(tokens);
            var ast1        = transformer.Transform(ast0);

            compiler.RegisterVariable <int>("apa");

            var expression = compiler.Compile(ast1) as LambdaXzaarCompiledScript;
            var result     = expression.Invoke <int>(10);

            Assert.AreEqual(10 * 10, result);
        }
Exemplo n.º 15
0
        public void Compile_value_lt_1_mul_2()
        {
            var lexer       = new XzaarScriptLexer();
            var parser      = new XzaarScriptParser();
            var transformer = new XzaarScriptTransformer();
            var compiler    = new DotNetXzaarScriptCompiler();
            var tokens      = lexer.Tokenize("(apa == 8) || (apa < (1 * 2))");
            var ast0        = parser.Parse(tokens);
            var ast1        = transformer.Transform(ast0);

            compiler.RegisterVariable <int>("apa");

            var expression = compiler.Compile(ast1) as LambdaXzaarCompiledScript;

            Assert.IsTrue(expression.Invoke <bool>(0));
            Assert.IsTrue(expression.Invoke <bool>(8));
            Assert.IsFalse(expression.Invoke <bool>(10));
        }
Exemplo n.º 16
0
        public void TransformTest_a_lt_b_mul_c()
        {
            var lexer       = new XzaarScriptLexer();
            var parser      = new XzaarScriptParser();
            var transformer = new XzaarScriptTransformer();
            var tokens      = lexer.Tokenize("a < (b * c)");

            Assert.IsTrue(ValidateTokens(tokens, "a", "<", "(", "b", "*", "c", ")"),
                          $"Failed to validate tokens! Expected: 'a < (b * c)' but got '{string.Join(" ", tokens.Select(s => s.Value))}'");

            var ast = parser.Parse(tokens);

            ast = transformer.Transform(ast);

            Assert.AreEqual(1, ast.Children.Count);
            Assert.AreEqual(XzaarNodeTypes.PROGRAM, ast.NodeType);
            Assert.AreEqual(XzaarNodeTypes.EQUALITY, ast[0].NodeType);
        }
Exemplo n.º 17
0
        public void Conditiona_test_op_ordering_1()
        {
            var lexer       = new XzaarScriptLexer();
            var parser      = new XzaarScriptParser();
            var transformer = new XzaarScriptTransformer();
            var compiler    = new DotNetXzaarScriptCompiler();
            var tokens      = lexer.Tokenize("a && b || c");

            var ast0 = parser.Parse(tokens);
            var ast1 = transformer.Transform(ast0);

            compiler.RegisterVariable <bool>("a");
            compiler.RegisterVariable <bool>("b");
            compiler.RegisterVariable <bool>("c");

            var expression = compiler.Compile(ast1) as LambdaXzaarCompiledScript;

            Assert.AreEqual("(a, b, c) => ((a And b) Or c)", expression.GetLambdaExpression().ToString());
        }
Exemplo n.º 18
0
        public void TransformTest_if_else_then_without_bodies_semicolon_separated()
        {
            var lexer       = new XzaarScriptLexer();
            var parser      = new XzaarScriptParser();
            var transformer = new XzaarScriptTransformer();
            var compiler    = new DotNetXzaarScriptCompiler();
            var tokens      = lexer.Tokenize("if (a == 0) a = 3; else a = 4;");
            var ast         = parser.Parse(tokens);

            ast = transformer.Transform(ast);


            compiler.RegisterVariable <int>("a");

            var expression = compiler.Compile(ast) as LambdaXzaarCompiledScript;

            var str = expression.GetLambdaExpression().ToString();

            Assert.AreEqual("a => IIF((a == 0), (a = 3), (a = 4))", str);
        }
Exemplo n.º 19
0
        public void LexerTest_complex()
        {
            var lexer       = new XzaarScriptLexer();
            var tokenString = "a > b && c * j < 4 || apa == 5 && ( x - y == z || z * y > x )";
            var tokens      = lexer.Tokenize(tokenString);

            Assert.AreEqual(27, tokens.Count);
            Assert.AreEqual("a", tokens[0].Value);
            Assert.AreEqual(">", tokens[1].Value);
            Assert.AreEqual("b", tokens[2].Value);

            var values = tokenString.Split(' ');

            for (var i = 0; i < values.Length; i++)
            {
                var expected = values[i];
                var actual   = tokens[i].Value;
                Assert.AreEqual(expected, actual, $"Expected: {expected}. Actual: {actual}. At: {i}");
            }
        }
Exemplo n.º 20
0
        public void ParserTest_a_lt_b_mul_c()
        {
            var lexer  = new XzaarScriptLexer();
            var parser = new XzaarScriptParser();
            var tokens = lexer.Tokenize("a < (b * c)");

            Assert.IsTrue(ValidateTokens(tokens, "a", "<", "(", "b", "*", "c", ")"),
                          $"Failed to validate tokens! Expected: 'a < (b * c)' but got '{string.Join(" ", tokens.Select(s => s.Value))}'");

            var ast = parser.Parse(tokens);

            Assert.AreEqual(3, ast.Children.Count);
            Assert.AreEqual(XzaarNodeTypes.PROGRAM, ast.NodeType);
            Assert.AreEqual(XzaarNodeTypes.LITERAL, ast[0].NodeType);
            Assert.AreEqual(XzaarNodeTypes.EQUALITY_OPERATOR, ast[1].NodeType);
            if (ast[2].NodeType != XzaarNodeTypes.BODY && ast[2].NodeType != XzaarNodeTypes.EXPRESSION)
            {
                Assert.Fail("Expected the last node type to be of type body or expression but was " + ast[2].NodeType);
            }
            // Assert.AreEqual(XzaarNodeTypes.BODY, ast[2].NodeType);
        }
Exemplo n.º 21
0
        public void Interpreter_full_chain_complex_3()
        {
            var lexer       = new XzaarScriptLexer();
            var parser      = new XzaarScriptParser();
            var transformer = new XzaarScriptTransformer();
            var compiler    = new DotNetXzaarScriptCompiler();
            var tokens      = lexer.Tokenize("apa == 8 && over == 9000 || apa == 24");
            var ast0        = parser.Parse(tokens);
            var ast1        = transformer.Transform(ast0);

            compiler.RegisterVariable <int>("apa");
            compiler.RegisterVariable <int>("over");

            var expression = compiler.Compile(ast1) as LambdaXzaarCompiledScript;

            Assert.AreEqual("(apa, over) => (((apa == 8) And (over == 9000)) Or (apa == 24))", expression.GetLambdaExpression().ToString());

            Assert.IsTrue(expression.Invoke <bool>(8, 9000));
            Assert.IsFalse(expression.Invoke <bool>(8, 0));
            Assert.IsTrue(expression.Invoke <bool>(24, 0));
            Assert.IsFalse(expression.Invoke <bool>(0, 0));
        }