aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/parser
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-02 23:48:28 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-02 23:48:28 +0000
commit6b0e8c55ad423aef60720ee4b3bb455de74f25f3 (patch)
tree4a6b2da3b66c8201507e11fdeaab39d76f261821 /src/main/java/org/shedlang/compiler/parser
parent0e4ddd473e1ad411005dcedd0af2049e8128c3d3 (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.java20
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);