aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-08 21:20:15 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-08 21:20:15 +0100
commitf48c702780581edb1022fab7f938260089432d06 (patch)
tree4d7877050703ca8160cdd94bda285fcbd6f20151 /src/test/java
parent19235b59a39e82d5714ac60d8c5665bd44a0278f (diff)
Handle precedence when parsing expressions
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/parser/ParserPrecedenceTests.java42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/parser/ParserPrecedenceTests.java b/src/test/java/org/shedlang/compiler/parser/ParserPrecedenceTests.java
new file mode 100644
index 00000000..471b46fe
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/parser/ParserPrecedenceTests.java
@@ -0,0 +1,42 @@
+package org.shedlang.compiler.parser;
+
+import org.junit.jupiter.api.Test;
+
+import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.*;
+import static org.shedlang.compiler.parser.ParserTesting.parseString;
+import static org.zwobble.precisely.AssertThat.assertThat;
+
+public class ParserPrecedenceTests {
+ @Test
+ public void callHasHigherPrecedenceThanAddition() {
+ var source = "1 + f()";
+
+ var node = parseString(source, Parser::parseTopLevelExpression);
+
+ assertThat(
+ node,
+ isUntypedAddNode(
+ isUntypedIntLiteralNode(1),
+ isUntypedCallNode()
+ .withReceiver(isUntypedReferenceNode("f"))
+ )
+ );
+ }
+ @Test
+ public void subtractionIsLeftAssociative() {
+ var source = "1 - 2 - 3";
+
+ var node = parseString(source, Parser::parseTopLevelExpression);
+
+ assertThat(
+ node,
+ isUntypedSubNode(
+ isUntypedSubNode(
+ isUntypedIntLiteralNode(1),
+ isUntypedIntLiteralNode(2)
+ ),
+ isUntypedIntLiteralNode(3)
+ )
+ );
+ }
+}