static void Main(string[] args) { while (true) { Console.Write("> "); var line = Console.ReadLine(); if (string.IsNullOrWhiteSpace(line)) { return; } var parser = new Parser(line); var syntaxTree = parser.Parse(); var color = Console.ForegroundColor; PrettyPrint(syntaxTree.Root); if (!parser.Diagnostics.Any()) { var e = new Evaluator(syntaxTree.Root); float result = e.Evaluate(); Console.WriteLine(result); } else { Console.ForegroundColor = ConsoleColor.Red; foreach (var diagnostic in parser.Diagnostics) { Console.Write(diagnostic); } Console.ForegroundColor = color; } var lexer = new Lexer(line); while (true) { var token = lexer.NextToken(); if (token.Kind == SyntaxKind.EndOfFileToken) { break; } Console.Write($"{token.Kind}: '{token.Text}' "); if (token.Value != null) { Console.WriteLine($" {token.Value}"); } Console.WriteLine(); } } }
public Parser(string text) { var tokens = new List <SyntaxToken>(); var lexer = new Lexer(text); SyntaxToken token; do { token = lexer.NextToken(); if (token.Kind != SyntaxKind.WhitespaceToken && token.Kind != SyntaxKind.BadToken) { tokens.Add(token); } } while(token.Kind != SyntaxKind.EndOfFileToken); _tokens = tokens.ToArray(); _diagnostics.AddRange(lexer.Diagnostics); }
private static void Match(string expected, string source, bool removeSpaces = true) { var actual = new StringBuilder(); var lexer = new Lexer(source); var token = lexer.NextToken(); while (token.Type != TokenType.Eof) { switch (token.Type) { case TokenType.Number: actual.Append("n$").Append(token.Text); break; case TokenType.String: actual.Append("'").Append(token.Text).Append("'"); break; case TokenType.Identifier: actual.Append("i$").Append(token.Text); break; case TokenType.Dot: actual.Append("d$").Append(token.Text); break; default: if (token.Type.IsKeyword()) actual.Append("k$").Append(token.Text); else actual.Append(token.Text); break; } token = lexer.NextToken(); } actual.Append(token.Text); if (removeSpaces) expected = expected.Replace(Environment.NewLine, string.Empty).Replace(" ", string.Empty); Assert.AreEqual(expected, actual.ToString()); }