Ejemplo n.º 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");
            }
        }
Ejemplo n.º 2
0
        public void UnaryOperatorPrecedence_HigherThanBinaryOperatorPrecedence(
            [ValueSource(nameof(UnaryOperators))]   TokenKind unaryOp,
            [ValueSource(nameof(BinaryOperators))]  TokenKind binaryOp)
        {
            // Arrange
            var unaryPrecedence  = unaryOp.UnaryOperatorPrecedence();
            var binaryPrecedence = binaryOp.BinaryOperatorPrecedence();

            // Act
            var highter = unaryPrecedence > binaryPrecedence;

            // Assert
            Assert.That(highter, Is.True);
        }
Ejemplo n.º 3
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");
            }
        }
Ejemplo n.º 4
0
 public static bool IsBinaryOperator(this TokenKind kind)
 => kind.BinaryOperatorPrecedence() > 0;