diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-02 19:04:57 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-02 19:04:57 +0000 |
| commit | e5857e15c3b90a4023ee57b9d417391d4dabfa7e (patch) | |
| tree | 2b8e1e38b293b589b367b9932a64f1f663949f05 /src/main/java | |
| parent | 71544066ce3b74c18973e00348ea44faf052d5e5 (diff) | |
Parse resume statements
Diffstat (limited to 'src/main/java')
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); |
