diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:48:45 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:48:45 +0100 |
| commit | 76fb53ae402d869df06a5b2652e7891865e247b3 (patch) | |
| tree | c40d29a4284f12b25a6ad8db5074a31263f7bb8a /src/main/java | |
| parent | 9d66911592c3e3f34aaafdd09c7dd9d96e720e18 (diff) | |
Parse calls with effects
Diffstat (limited to 'src/main/java')
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, "\\)"), |
