aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-02 19:04:57 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-02 19:04:57 +0000
commite5857e15c3b90a4023ee57b9d417391d4dabfa7e (patch)
tree2b8e1e38b293b589b367b9932a64f1f663949f05 /src/main/java
parent71544066ce3b74c18973e00348ea44faf052d5e5 (diff)
Parse resume statements
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedResumeNode.java13
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java18
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
5 files changed, 38 insertions, 1 deletions
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 90b0c29b..09eb4909 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, UntypedWhileNode {
+public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedAssignNode, UntypedBlockReturnNode, UntypedExpressionStatementNode, UntypedFunctionReturnNode, UntypedResumeNode, UntypedWhileNode {
UntypedFunctionStatementBehaviour behaviour();
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedResumeNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedResumeNode.java
new file mode 100644
index 00000000..a0eb49e6
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedResumeNode.java
@@ -0,0 +1,13 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+public record UntypedResumeNode(
+ UntypedExpressionNode expression,
+ Source source
+) implements UntypedFunctionStatementNode {
+ @Override
+ public UntypedFunctionStatementBehaviour behaviour() {
+ return UntypedFunctionStatementBehaviour.TERMINATE;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 1ed7799e..5d4599e1 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -461,6 +461,9 @@ public class Parser {
case KEYWORD_ASSIGN, KEYWORD_VAL, KEYWORD_VAR, SYMBOL_UNDERSCORE ->
parseAssign(tokens);
+ case KEYWORD_RESUME ->
+ parseResume(tokens);
+
case KEYWORD_RETURN ->
parseFunctionReturn(tokens);
@@ -821,6 +824,21 @@ public class Parser {
};
}
+ private static UntypedFunctionStatementNode parseResume(TokenIterator<TokenType> tokens) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.KEYWORD_RESUME);
+
+ var expression = parseTopLevelExpression(tokens);
+
+ tokens.skip(TokenType.SYMBOL_SEMICOLON);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedResumeNode(expression, source);
+ }
+
private static UntypedExpressionNode parseStringLiteral(TokenIterator<TokenType> tokens) {
var start = tokens.position();
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
index 5134b490..41a9a421 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
@@ -41,6 +41,9 @@ class DeclaredVariables {
case UntypedFunctionReturnNode functionReturn ->
variables;
+ case UntypedResumeNode resume ->
+ variables;
+
case UntypedWhileNode while_ ->
variables;
};
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index bdf185f8..00797708 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -852,6 +852,9 @@ public class TypeChecker {
case UntypedAssignNode assign ->
typeCheckAssign(assign, context);
+ case UntypedResumeNode resume ->
+ throw new UnsupportedOperationException("TODO");
+
case UntypedBlockReturnNode blockReturn ->
typeCheckBlockReturn(blockReturn, context);