public void TokenizeString() { var lexer = new BaZicLexer(); var test1 = "VARIABLE var1 = \"Hello\""; var result = lexer.Tokenize(test1); Assert.AreEqual(6, result.Count); Assert.AreEqual(TokenType.String, result[4].TokenType); Assert.AreEqual("Hello", result[4].Value); test1 = "VARIABLE var1 = \"Hello\" \"World\""; result = lexer.Tokenize(test1); Assert.AreEqual(7, result.Count); Assert.AreEqual("Hello", result[4].Value); Assert.AreEqual("World", result[5].Value); test1 = "VARIABLE var1 = \"Hello\"+\"World\""; result = lexer.Tokenize(test1); Assert.AreEqual(8, result.Count); Assert.AreEqual("Hello", result[4].Value); Assert.AreEqual(TokenType.Plus, result[5].TokenType); Assert.AreEqual("World", result[6].Value); test1 = "VARIABLE var1 = \"Hello\\\"World\\\"\""; result = lexer.Tokenize(test1); Assert.AreEqual(6, result.Count); Assert.AreEqual(TokenType.String, result[4].TokenType); Assert.AreEqual("Hello\\\"World\\\"", result[4].Value); }
public void TokenizeInvalid1() { var lexer = new BaZicLexer(); var test1 = "VARIABLE { @var1"; var result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Variable, result[1].TokenType); Assert.AreEqual("VARIABLE", result[1].Value); Assert.AreEqual(TokenType.NotDefined, result[2].TokenType); Assert.AreEqual("{", result[2].Value); Assert.AreEqual(TokenType.NotDefined, result[3].TokenType); Assert.AreEqual("@var1", result[3].Value); Assert.AreEqual(TokenType.EndCode, result[4].TokenType); test1 = "VARIABLE var1 = 1;"; result = lexer.Tokenize(test1); Assert.AreEqual(6, result.Count); Assert.AreEqual(TokenType.NotDefined, result[4].TokenType); }
public void TokenizeBasicTest() { var lexer = new BaZicLexer(); var test1 = " VARIABLE var1"; var result = lexer.Tokenize(test1); Assert.AreEqual(4, result.Count); Assert.AreEqual(TokenType.StartCode, result[0].TokenType); Assert.AreEqual(TokenType.Variable, result[1].TokenType); Assert.AreEqual("VARIABLE", result[1].Value); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("var1", result[2].Value); Assert.AreEqual(TokenType.EndCode, result[3].TokenType); result = lexer.Tokenize(test1, keepWhitespaces: true); Assert.AreEqual(7, result.Count); Assert.AreEqual(TokenType.StartCode, result[0].TokenType); Assert.AreEqual(TokenType.Variable, result[2].TokenType); Assert.AreEqual("VARIABLE", result[2].Value); Assert.AreEqual(TokenType.Identifier, result[5].TokenType); Assert.AreEqual("var1", result[5].Value); Assert.AreEqual(TokenType.EndCode, result[6].TokenType); }
public void TokenizeInvalid2() { var lexer = new BaZicLexer(); var test1 = "VARIABLE var1 = 1;"; var result = lexer.Tokenize(test1); Assert.AreEqual(6, result.Count); Assert.AreEqual(TokenType.NotDefined, result[4].TokenType); }
public void TokenizeVariableDefaultValue() { var lexer = new BaZicLexer(); var test1 = "VARIABLE var1 = true"; var result = lexer.Tokenize(test1); Assert.AreEqual(6, result.Count); Assert.AreEqual(TokenType.Variable, result[1].TokenType); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual(TokenType.Equal, result[3].TokenType); Assert.AreEqual(TokenType.True, result[4].TokenType); Assert.AreEqual(TokenType.EndCode, result[5].TokenType); }
public void TokenizeVariableArray() { var lexer = new BaZicLexer(); var test1 = "VARIABLE var1[]"; var result = lexer.Tokenize(test1); Assert.AreEqual(6, result.Count); Assert.AreEqual(TokenType.Variable, result[1].TokenType); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual(TokenType.LeftBracket, result[3].TokenType); Assert.AreEqual(TokenType.RightBracket, result[4].TokenType); Assert.AreEqual(TokenType.EndCode, result[5].TokenType); }
/// <summary> /// Parse a BaZic code and returns a syntax tree representation of the algorithm. /// </summary> /// <param name="inputCode">The BaZic code to analyze.</param> /// <param name="xamlCode">The XAML code to analyze that represents the user interface.</param> /// <param name="resourceFilePaths">Paths to the resources files (like PNG or JPG) required for the XAML code.</param> /// <param name="optimize">(optional) Defines whether the generated syntax tree must be optimized for the interpreter or not.</param> /// <returns>A <see cref="BaZicProgram"/> that represents the syntax tree that corresponds to the input code.</returns> public ParserResult Parse(string inputCode, string xamlCode, IEnumerable <string> resourceFilePaths = null, bool optimize = false) { _issues.Clear(); try { var tokens = _lexer.Tokenize(inputCode); return(Parse(tokens, xamlCode, resourceFilePaths, optimize)); } catch (Exception exception) { CoreHelper.ReportException(exception); _issues.Add(exception); return(new ParserResult(null, new AggregateException(_issues))); } }
private void RunProgramReleaseButton_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(BaZicCodeTextBox.Text)) { MessageBox.Show("There is no BaZic code to run."); return; } Logs = string.Empty; if (string.IsNullOrWhiteSpace(XamlCodeTextBox.Text)) { XamlCodeTextBox.Text = string.Empty; } var lexer = new BaZicLexer(); var parser = new BaZicParser(); var tokens = lexer.Tokenize(BaZicCodeTextBox.Text); var abstractSyntaxTree = parser.Parse(tokens, XamlCodeTextBox.Text, optimize: OptimizeCheckBox.IsChecked.Value); foreach (var issue in abstractSyntaxTree.Issues.InnerExceptions.OfType <BaZicParserException>()) { Log(issue.ToString()); } if (abstractSyntaxTree.Program != null && abstractSyntaxTree.Issues.InnerExceptions.OfType <BaZicParserException>().All(issue => issue.Level != Core.Enums.BaZicParserExceptionLevel.Error)) { RunProgramButton.Visibility = Visibility.Collapsed; RunProgramReleaseButton.Visibility = Visibility.Collapsed; OptimizeCheckBox.Visibility = Visibility.Collapsed; PauseButton.Visibility = Visibility.Visible; StopButton.Visibility = Visibility.Visible; _interpreter = new BaZicInterpreter(abstractSyntaxTree.Program); _interpreter.StateChanged += Interpreter_StateChanged; var t = _interpreter.StartReleaseAsync(true); } else { Log("The program has not been build."); } }
public void TokenizeVariableArrayWithValues() { var lexer = new BaZicLexer(); var test1 = "VARIABLE var1[] = [\"Hello\", \"World\"]"; var result = lexer.Tokenize(test1); Assert.AreEqual(12, result.Count); Assert.AreEqual(TokenType.Variable, result[1].TokenType); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual(TokenType.LeftBracket, result[3].TokenType); Assert.AreEqual(TokenType.RightBracket, result[4].TokenType); Assert.AreEqual(TokenType.Equal, result[5].TokenType); Assert.AreEqual(TokenType.LeftBracket, result[6].TokenType); Assert.AreEqual(TokenType.String, result[7].TokenType); Assert.AreEqual(TokenType.Comma, result[8].TokenType); Assert.AreEqual(TokenType.String, result[9].TokenType); Assert.AreEqual(TokenType.RightBracket, result[10].TokenType); Assert.AreEqual(TokenType.EndCode, result[11].TokenType); }
public void TokenizeCode() { var lexer = new BaZicLexer(); var test1 = @"VARIABLE var1 = 1 EXTERN FUNCTION Main(arg1, arg2) IF NOT arg1 <= arg2 THEN System.Console.WriteLine(""Hello ""+var1+1) END IF END FUNCTION"; var result = lexer.Tokenize(test1); Assert.AreEqual(43, result.Count); var expectedToken = new TokenType[] { TokenType.StartCode, TokenType.Variable, TokenType.Identifier, TokenType.Equal, TokenType.Integer, TokenType.NewLine, TokenType.NewLine, TokenType.Extern, TokenType.Function, TokenType.Identifier, TokenType.LeftParenth, TokenType.Identifier, TokenType.Comma, TokenType.Identifier, TokenType.RightParenth, TokenType.NewLine, TokenType.If, TokenType.Not, TokenType.Identifier, TokenType.LesserThan, TokenType.Equal, TokenType.Identifier, TokenType.Then, TokenType.NewLine, TokenType.Identifier, TokenType.Dot, TokenType.Identifier, TokenType.Dot, TokenType.Identifier, TokenType.LeftParenth, TokenType.String, TokenType.Plus, TokenType.Identifier, TokenType.Plus, TokenType.Integer, TokenType.RightParenth, TokenType.NewLine, TokenType.End, TokenType.If, TokenType.NewLine, TokenType.End, TokenType.Function, TokenType.EndCode, }; for (var i = 0; i < result.Count; i++) { Assert.AreEqual(expectedToken[i], result[i].TokenType); } }
public void TokenizeIdentifiers() { var lexer = new BaZicLexer(); var test1 = "VARIABLE Variable = 1"; var result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Variable, result[2].TokenType); test1 = "VARIABLE Variables"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("Variables", result[2].Value); test1 = "VARIABLE Variable_Name"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("Variable_Name", result[2].Value); test1 = "VARIABLE Variable-Name"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("Variable", result[2].Value); test1 = "VARIABLE v"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("v", result[2].Value); test1 = "VARIABLE 1v"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.NotDefined, result[2].TokenType); test1 = "VARIABLE v1"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("v1", result[2].Value); test1 = "VARIABLE v.ToString()"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("v", result[2].Value); test1 = "VARIABLE v@"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("v@", result[2].Value); test1 = "VARIABLE v@[]"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("v@", result[2].Value); test1 = "VARIABLE ANDHello"; result = lexer.Tokenize(test1); Assert.AreEqual(TokenType.Identifier, result[2].TokenType); Assert.AreEqual("ANDHello", result[2].Value); }
public void TokenizeDouble() { var lexer = new BaZicLexer(); var test1 = "var1 = 123.45"; var result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Double, result[3].TokenType); Assert.AreEqual("123.45", result[3].Value); test1 = "var1 = -123.45"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Double, result[3].TokenType); Assert.AreEqual("-123.45", result[3].Value); test1 = "var1 = -.45"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Double, result[3].TokenType); Assert.AreEqual("-0.45", result[3].Value); test1 = "var1 = +123.45"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Double, result[3].TokenType); Assert.AreEqual("123.45", result[3].Value); test1 = "var1 = -(-123.45 + 2.45)"; result = lexer.Tokenize(test1); Assert.AreEqual(10, result.Count); Assert.AreEqual(TokenType.Minus, result[3].TokenType); Assert.AreEqual(TokenType.LeftParenth, result[4].TokenType); Assert.AreEqual(TokenType.Double, result[5].TokenType); Assert.AreEqual(TokenType.Plus, result[6].TokenType); Assert.AreEqual(TokenType.Double, result[7].TokenType); Assert.AreEqual(TokenType.RightParenth, result[8].TokenType); Assert.AreEqual("-123.45", result[5].Value); Assert.AreEqual("2.45", result[7].Value); test1 = "-1.45 + +4.45"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Double, result[1].TokenType); Assert.AreEqual("-1.45", result[1].Value); Assert.AreEqual(TokenType.Plus, result[2].TokenType); Assert.AreEqual(TokenType.Double, result[3].TokenType); Assert.AreEqual("4.45", result[3].Value); test1 = "var1 = -123.45f"; result = lexer.Tokenize(test1); Assert.AreEqual(7, result.Count); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("-123", result[3].Value); Assert.AreEqual(TokenType.Dot, result[4].TokenType); Assert.AreEqual(TokenType.NotDefined, result[5].TokenType); test1 = "var1 = -123.45.6"; result = lexer.Tokenize(test1); Assert.AreEqual(7, result.Count); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("-123", result[3].Value); test1 = "var1 = -123,45"; result = lexer.Tokenize(test1); Assert.AreEqual(7, result.Count); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("-123", result[3].Value); test1 = "var1 = -123 45"; result = lexer.Tokenize(test1); Assert.AreEqual(6, result.Count); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("-123", result[3].Value); test1 = "1.2+1.2"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Double, result[1].TokenType); Assert.AreEqual("1.2", result[1].Value); Assert.AreEqual(TokenType.Plus, result[2].TokenType); Assert.AreEqual(TokenType.Double, result[3].TokenType); Assert.AreEqual("1.2", result[3].Value); test1 = "1.2-1.2"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Double, result[1].TokenType); Assert.AreEqual("1.2", result[1].Value); Assert.AreEqual(TokenType.Minus, result[2].TokenType); Assert.AreEqual(TokenType.Double, result[3].TokenType); Assert.AreEqual("1.2", result[3].Value); }
public void TokenizeIntegers() { var lexer = new BaZicLexer(); var test1 = "var1 = 123"; var result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("123", result[3].Value); test1 = "var1 = -123"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("-123", result[3].Value); test1 = "var1 = +123"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("123", result[3].Value); test1 = "var1 = -(-123 + 2)"; result = lexer.Tokenize(test1); Assert.AreEqual(10, result.Count); Assert.AreEqual(TokenType.Minus, result[3].TokenType); Assert.AreEqual(TokenType.LeftParenth, result[4].TokenType); Assert.AreEqual(TokenType.Integer, result[5].TokenType); Assert.AreEqual(TokenType.Plus, result[6].TokenType); Assert.AreEqual(TokenType.Integer, result[7].TokenType); Assert.AreEqual(TokenType.RightParenth, result[8].TokenType); Assert.AreEqual("-123", result[5].Value); Assert.AreEqual("2", result[7].Value); test1 = "-1 + +4"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[1].TokenType); Assert.AreEqual("-1", result[1].Value); Assert.AreEqual(TokenType.Plus, result[2].TokenType); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("4", result[3].Value); test1 = "1+-1"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[1].TokenType); Assert.AreEqual("1", result[1].Value); Assert.AreEqual(TokenType.Plus, result[2].TokenType); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("-1", result[3].Value); test1 = "1-+1"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[1].TokenType); Assert.AreEqual("1", result[1].Value); Assert.AreEqual(TokenType.Minus, result[2].TokenType); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("1", result[3].Value); test1 = "1--1"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[1].TokenType); Assert.AreEqual("1", result[1].Value); Assert.AreEqual(TokenType.Minus, result[2].TokenType); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("-1", result[3].Value); test1 = "1++1"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[1].TokenType); Assert.AreEqual("1", result[1].Value); Assert.AreEqual(TokenType.Plus, result[2].TokenType); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("1", result[3].Value); test1 = "1+1"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[1].TokenType); Assert.AreEqual("1", result[1].Value); Assert.AreEqual(TokenType.Plus, result[2].TokenType); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("1", result[3].Value); test1 = "1-1"; result = lexer.Tokenize(test1); Assert.AreEqual(5, result.Count); Assert.AreEqual(TokenType.Integer, result[1].TokenType); Assert.AreEqual("1", result[1].Value); Assert.AreEqual(TokenType.Minus, result[2].TokenType); Assert.AreEqual(TokenType.Integer, result[3].TokenType); Assert.AreEqual("1", result[3].Value); }