aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
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
parent0e4ddd473e1ad411005dcedd0af2049e8128c3d3 (diff)
Parse break statements
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedBreakNode.java15
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java20
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java16
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);
};