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 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"); }
public static void WritePunctuation(this TextWriter writer, TokenKind kind) { var text = kind.GetText(); Debug.Assert(text != null); writer.WritePunctuation(text); }
public static void WriteKeyword(this TextWriter writer, TokenKind kind) { var text = kind.GetText(); Debug.Assert(kind.IsKeyword() && text != null); writer.WriteKeyword(text); }
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)); }
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 void WritePunctuation(this TextWriter writer, TokenKind kind) => writer.WritePunctuation(kind.GetText());
public static void WriteKeyword(this TextWriter writer, TokenKind kind) => writer.WriteKeyword(kind.GetText());