コード例 #1
0
        public void Parse_WithBinaryExpressions_HonorsPrecedences(
            [ValueSource(nameof(BinaryOperators))] TokenKind op1,
            [ValueSource(nameof(BinaryOperators))] TokenKind op2)
        {
            // Arrange
            var op1Precedence = op1.BinaryOperatorPrecedence();
            var op2Precedence = op2.BinaryOperatorPrecedence();

            var op1Text = op1.GetText();
            var op2Text = op2.GetText();

            var text = $"a {op1.GetText()} b {op2.GetText()} c";

            // Act
            var expression = ParseExpression(text);

            // Assert
            Assert.That(op1Text, Is.Not.Null);
            Assert.That(op2Text, Is.Not.Null);

            // Assert
            if (op1Precedence >= op2Precedence)
            {
                // Expected:
                //      op2
                //     /  \
                //   op1   c
                //  /  \
                // a    b

                using var e = expression.Enumerate();

                e.AssertBinaryExpression(op2);
                e.AssertBinaryExpression(op1);
                e.AssertNameExpression("a");
                e.AssertNameExpression("b");
                e.AssertNameExpression("c");
            }
            else
            {
                // Expected:
                //   op1
                //  /  \
                // a   op2
                //    /  \
                //   b    c

                using var e = expression.Enumerate();

                e.AssertBinaryExpression(op1);
                e.AssertNameExpression("a");
                e.AssertBinaryExpression(op2);
                e.AssertNameExpression("b");
                e.AssertNameExpression("c");
            }
        }
コード例 #2
0
        public void Parse_WithUnaryPair_BuildsTree(
            [ValueSource(nameof(UnaryOperators))] TokenKind op1,
            [ValueSource(nameof(UnaryOperators))] TokenKind op2)
        {
            // Arrange
            var op1Text = op1.GetText();
            var op2Text = op2.GetText();

            var text = $"{op1Text} {op2Text} a";

            // Act
            var expression = ParseExpression(text);

            // Assert expected:
            //   op1
            //    |
            //   op2
            //   / \
            //  a   b
            using var e = expression.Enumerate();

            e.AssertUnaryExpression(op1);
            e.AssertUnaryExpression(op2);
            e.AssertNameExpression("a");
        }
コード例 #3
0
        public static void WritePunctuation(this TextWriter writer, TokenKind kind)
        {
            var text = kind.GetText();

            Debug.Assert(text != null);

            writer.WritePunctuation(text);
        }
コード例 #4
0
        public static void WriteKeyword(this TextWriter writer, TokenKind kind)
        {
            var text = kind.GetText();

            Debug.Assert(kind.IsKeyword() && text != null);

            writer.WriteKeyword(text);
        }
コード例 #5
0
        public void GetText_WhenLexed_ReturnsSameKind(
            [ValueSource(nameof(DefaultTextTokens))] TokenKind kind)
        {
            // Arrange
            var source = SourceText.From(kind.GetText());

            // Act
            var tokens = Lexer.Lex(source).ToList();

            // Assert
            Assert.That(tokens.Count, Is.EqualTo(2));
            Assert.That(tokens[0].Kind, Is.EqualTo(kind));
            Assert.That(tokens[1].Kind, Is.EqualTo(TokenKind.EoF));
        }
コード例 #6
0
        public void Parse_WithBinaryUnaryPair_HonorsPrecedences(
            [ValueSource(nameof(UnaryOperators))]  TokenKind unaryOp,
            [ValueSource(nameof(BinaryOperators))] TokenKind binaryOp)
        {
            // Arrange
            var unaryPrecedence  = unaryOp.UnaryOperatorPrecedence();
            var binaryPrecedence = binaryOp.BinaryOperatorPrecedence();

            var unaryText  = unaryOp.GetText();
            var binaryText = binaryOp.GetText();

            var text = $"{unaryText} a {binaryText} b";

            // Act
            var expression = ParseExpression(text);

            // Assert
            if (unaryPrecedence >= binaryPrecedence)
            {
                // Expected:
                //    binary
                //    /    \
                // unary    b
                //   |
                //   a

                using var e = expression.Enumerate();

                e.AssertBinaryExpression(binaryOp);
                e.AssertUnaryExpression(unaryOp);
                e.AssertNameExpression("a");
                e.AssertNameExpression("b");
            }
            else
            {
                // Expected:
                //  unary
                //    |
                //  binary
                //   /  \
                //  a    b

                using var e = expression.Enumerate();

                e.AssertUnaryExpression(unaryOp);
                e.AssertBinaryExpression(binaryOp);
                e.AssertNameExpression("a");
                e.AssertNameExpression("b");
            }
        }
コード例 #7
0
 public static void WritePunctuation(this TextWriter writer, TokenKind kind) => writer.WritePunctuation(kind.GetText());
コード例 #8
0
 public static void WriteKeyword(this TextWriter writer, TokenKind kind) => writer.WriteKeyword(kind.GetText());