From 1d41ef64406e575caf012f8a50febc15805bafca Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 2 Feb 2025 18:43:06 +0000 Subject: Parse greater than or equal expressions --- .../shedlang/compiler/ast/untyped/UntypedBinaryOperator.java | 1 + src/main/java/org/shedlang/compiler/parser/Parser.java | 1 + .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 3 +++ .../shedlang/compiler/ast/untyped/UntypedNodeMatchers.java | 7 +++++++ .../compiler/parser/ParserRelationalOperationTests.java | 12 ++++++++++++ 5 files changed, 24 insertions(+) (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java index c130323b..aa14bcba 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBinaryOperator.java @@ -4,6 +4,7 @@ public enum UntypedBinaryOperator { ADD, EQUALS, GREATER_THAN, + GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, NOT_EQUAL, diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index cc47c194..9f921e2e 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -348,6 +348,7 @@ public class Parser { new BinaryOperationParser(TokenType.SYMBOL_LESS_THAN, OperatorPrecedence.RELATIONAL, UntypedBinaryOperator.LESS_THAN), new BinaryOperationParser(TokenType.SYMBOL_LESS_THAN_OR_EQUAL, OperatorPrecedence.RELATIONAL, UntypedBinaryOperator.LESS_THAN_OR_EQUAL), new BinaryOperationParser(TokenType.SYMBOL_GREATER_THAN, OperatorPrecedence.RELATIONAL, UntypedBinaryOperator.GREATER_THAN), + new BinaryOperationParser(TokenType.SYMBOL_GREATER_THAN_OR_EQUAL, OperatorPrecedence.RELATIONAL, UntypedBinaryOperator.GREATER_THAN_OR_EQUAL), new BinaryOperationParser(TokenType.SYMBOL_PLUS, OperatorPrecedence.ADD, UntypedBinaryOperator.ADD), new BinaryOperationParser(TokenType.SYMBOL_MINUS, OperatorPrecedence.ADD, UntypedBinaryOperator.SUB), new CallParser() diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index e0e9dc1c..db249c0d 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -241,6 +241,9 @@ public class TypeChecker { case GREATER_THAN -> throw new UnsupportedOperationException("TODO"); + case GREATER_THAN_OR_EQUAL -> + throw new UnsupportedOperationException("TODO"); + case LESS_THAN -> throw new UnsupportedOperationException("TODO"); diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java index c6948d19..bf46b533 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java @@ -193,6 +193,13 @@ public class UntypedNodeMatchers { return isUntypedBinaryOperationNode(UntypedBinaryOperator.GREATER_THAN, left, right); } + public static Matcher isUntypedGreaterThanOrEqualNode( + Matcher left, + Matcher right + ) { + return isUntypedBinaryOperationNode(UntypedBinaryOperator.GREATER_THAN_OR_EQUAL, left, right); + } + public static Matcher isUntypedIfNode( Matcher> conditionalBranches, Matcher elseBody diff --git a/src/test/java/org/shedlang/compiler/parser/ParserRelationalOperationTests.java b/src/test/java/org/shedlang/compiler/parser/ParserRelationalOperationTests.java index 8d4a85ec..90acf490 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserRelationalOperationTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserRelationalOperationTests.java @@ -42,4 +42,16 @@ public class ParserRelationalOperationTests { isUntypedIntLiteralNode(2) )); } + + @Test + public void canParseGreaterThanOrEqualExpression() { + var source = "1 >= 2"; + + var node = parseString(source, Parser::parseTopLevelExpression); + + assertThat(node, isUntypedGreaterThanOrEqualNode( + isUntypedIntLiteralNode(1), + isUntypedIntLiteralNode(2) + )); + } } -- cgit v1.2.3