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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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); }
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()); }
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); }
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}"); } }
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); }
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)); }