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"); } }
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); }
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"); } }
public static bool IsBinaryOperator(this TokenKind kind) => kind.BinaryOperatorPrecedence() > 0;