From 6b0e8c55ad423aef60720ee4b3bb455de74f25f3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Dec 2023 23:48:28 +0000 Subject: Parse break statements --- .../compiler/ast/untyped/UntypedBreakNode.java | 15 +++++++++++++++ .../ast/untyped/UntypedFunctionStatementNode.java | 2 +- .../java/org/shedlang/compiler/parser/Parser.java | 20 ++++++++++++++++++++ .../compiler/typechecker/DeclaredVariables.java | 3 +++ .../shedlang/compiler/typechecker/TypeChecker.java | 16 +++++++++++++--- 5 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedBreakNode.java (limited to 'src/main/java') 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 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 tokens) { + var start = tokens.position(); + + tokens.skip(TokenType.KEYWORD_BREAK); + + var expression = tokens.isNext(TokenType.SYMBOL_SEMICOLON) + ? Optional.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 typeCheckBreak( + UntypedBreakNode untyped, + TypeCheckerContext context + ) { + throw new UnsupportedOperationException("TODO"); + } + private static TypeCheckerResult 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); }; -- cgit v1.2.3