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 | |
| parent | 0e4ddd473e1ad411005dcedd0af2049e8128c3d3 (diff) | |
Parse break statements
Diffstat (limited to 'src/main/java')
5 files changed, 52 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBreakNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBreakNode.java new file mode 100644 index 00000000..d57a7367 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBreakNode.java @@ -0,0 +1,15 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +import java.util.Optional; + +public record UntypedBreakNode( + Optional<UntypedExpressionNode> expression, + Source source +) implements UntypedFunctionStatementNode { + @Override + public UntypedFunctionStatementBehaviour behaviour() { + return UntypedFunctionStatementBehaviour.TERMINATE; + } +} diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java index 09eb4909..2ca95b2b 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.ast.untyped; -public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedAssignNode, UntypedBlockReturnNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedResumeNode, UntypedWhileNode { +public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedAssignNode, UntypedBlockReturnNode, UntypedBreakNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedResumeNode, UntypedWhileNode { UntypedFunctionStatementBehaviour behaviour(); } 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); diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java index 41a9a421..2a842d93 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java +++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java @@ -35,6 +35,9 @@ class DeclaredVariables { case UntypedBlockReturnNode blockReturn -> variables; + case UntypedBreakNode break_ -> + variables; + case UntypedExpressionStatementNode expressionStatement -> variables; diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index ca8f89ec..e7052ba3 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -276,6 +276,13 @@ public class TypeChecker { )); } + private static TypeCheckerResult<? extends TypedFunctionStatementNode> typeCheckBreak( + UntypedBreakNode untyped, + TypeCheckerContext context + ) { + throw new UnsupportedOperationException("TODO"); + } + private static TypeCheckerResult<TypedExpressionNode> typeCheckCall( UntypedCallNode untyped, TypeCheckerContext context @@ -978,18 +985,21 @@ public class TypeChecker { case UntypedAssignNode assign -> typeCheckAssign(assign, context); - case UntypedResumeNode resume -> - typeCheckResume(resume, context); - case UntypedBlockReturnNode blockReturn -> typeCheckBlockReturn(blockReturn, context); + case UntypedBreakNode break_ -> + typeCheckBreak(break_, context); + case UntypedExpressionStatementNode expressionStatement -> typeCheckExpressionStatement(expressionStatement, context); case UntypedFunctionReturnNode functionReturn -> typeCheckFunctionReturn(functionReturn, context); + case UntypedResumeNode resume -> + typeCheckResume(resume, context); + case UntypedWhileNode while_ -> typeCheckWhile(while_, context); }; |
