From 76fb53ae402d869df06a5b2652e7891865e247b3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 6 Jun 2023 19:48:45 +0100 Subject: Parse calls with effects --- src/main/java/org/shedlang/compiler/parser/Parser.java | 17 ++++++++++++----- .../java/org/shedlang/compiler/parser/TokenType.java | 1 + .../java/org/shedlang/compiler/parser/Tokeniser.java | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) (limited to 'src/main/java') 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 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 tokens) { @@ -84,11 +86,16 @@ public class Parser { static UntypedExpressionNode parseTopLevelExpression(TokenIterator 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 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 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, "\\)"), -- cgit v1.2.3