aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-06 19:48:45 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-06 19:48:45 +0100
commit76fb53ae402d869df06a5b2652e7891865e247b3 (patch)
treec40d29a4284f12b25a6ad8db5074a31263f7bb8a /src/main/java
parent9d66911592c3e3f34aaafdd09c7dd9d96e720e18 (diff)
Parse calls with effects
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java17
-rw-r--r--src/main/java/org/shedlang/compiler/parser/TokenType.java1
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Tokeniser.java1
3 files changed, 14 insertions, 5 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 528c4c76..6f5abb19 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -15,6 +15,8 @@ public class Parser {
private static UntypedExpressionNode parseCall(UntypedExpressionNode receiver, TokenIterator<TokenType> tokens) {
var start = receiver.source().start();
+ var hasEffects = tokens.trySkip(TokenType.SYMBOL_BANG);
+
tokens.skip(TokenType.SYMBOL_PAREN_OPEN);
var args = parseArgs(tokens);
tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
@@ -22,7 +24,7 @@ public class Parser {
var end = tokens.position();
var source = start.to(end);
- return new UntypedCallNode(receiver, args, false, source);
+ return new UntypedCallNode(receiver, args, hasEffects, source);
}
private static UntypedArgsNode parseArgs(TokenIterator<TokenType> tokens) {
@@ -84,11 +86,16 @@ public class Parser {
static UntypedExpressionNode parseTopLevelExpression(TokenIterator<TokenType> tokens) {
var left = parsePrimaryExpression(tokens);
- while (tokens.isNext(TokenType.SYMBOL_PAREN_OPEN)) {
- left = parseCall(left, tokens);
+ while (true) {
+ switch (tokens.peek().tokenType()) {
+ case SYMBOL_BANG, SYMBOL_PAREN_OPEN -> {
+ left = parseCall(left, tokens);
+ }
+ default -> {
+ return left;
+ }
+ }
}
-
- return left;
}
static UntypedNamespaceNode parseNamespace(TokenIterator<TokenType> tokens) {
diff --git a/src/main/java/org/shedlang/compiler/parser/TokenType.java b/src/main/java/org/shedlang/compiler/parser/TokenType.java
index 772d031d..fe01939a 100644
--- a/src/main/java/org/shedlang/compiler/parser/TokenType.java
+++ b/src/main/java/org/shedlang/compiler/parser/TokenType.java
@@ -9,6 +9,7 @@ public enum TokenType {
KEYWORD_FUN,
+ SYMBOL_BANG,
SYMBOL_COMMA,
SYMBOL_PAREN_OPEN,
SYMBOL_PAREN_CLOSE,
diff --git a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
index 28aebb46..0475d799 100644
--- a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
@@ -19,6 +19,7 @@ public class Tokeniser {
private static final RegexTokeniser<TokenType> tokeniser = new RegexTokeniser<>(
TokenType.UNKNOWN,
List.of(
+ RegexTokeniser.rule(TokenType.SYMBOL_BANG, "!"),
RegexTokeniser.rule(TokenType.SYMBOL_COMMA, ","),
RegexTokeniser.rule(TokenType.SYMBOL_PAREN_OPEN, "\\("),
RegexTokeniser.rule(TokenType.SYMBOL_PAREN_CLOSE, "\\)"),