Example #1
0
        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();
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
 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());
 }