diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-02 23:48:28 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-02 23:48:28 +0000 |
| commit | 6b0e8c55ad423aef60720ee4b3bb455de74f25f3 (patch) | |
| tree | 4a6b2da3b66c8201507e11fdeaab39d76f261821 /src/main/java/org/shedlang/compiler/parser | |
| parent | 0e4ddd473e1ad411005dcedd0af2049e8128c3d3 (diff) | |
Parse break statements
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 7b7e8358..1d56120b 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -171,6 +171,23 @@ public class Parser { return new UntypedBoolLiteralNode(value, source); } + private static UntypedFunctionStatementNode parseBreak(TokenIterator<TokenType> tokens) { + var start = tokens.position(); + + tokens.skip(TokenType.KEYWORD_BREAK); + + var expression = tokens.isNext(TokenType.SYMBOL_SEMICOLON) + ? Optional.<UntypedExpressionNode>empty() + : Optional.of(parseTopLevelExpression(tokens)); + + tokens.skip(TokenType.SYMBOL_SEMICOLON); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedBreakNode(expression, source); + } + private static class CallParser implements OperationParser { @Override public OperatorPrecedence precedence() { @@ -463,6 +480,9 @@ public class Parser { case KEYWORD_ASSIGN, KEYWORD_VAL, KEYWORD_VAR, SYMBOL_UNDERSCORE -> parseAssign(tokens); + case KEYWORD_BREAK -> + parseBreak(tokens); + case KEYWORD_RESUME -> parseResume(tokens); |
