diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-09 19:17:56 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-09 19:17:56 +0100 |
| commit | 383321e4cbd303255607adcd0f8a2338050c795d (patch) | |
| tree | 23c56abb2d2ea4eea0a40e4ebf7c143ce96de950 /src/main/java | |
| parent | bf55e95953edeefad8e83c034bfb4920d99c29ba (diff) | |
Handle if expression statement
Diffstat (limited to 'src/main/java')
4 files changed, 27 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java index 2d686147..e69883a0 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBlockNode.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.ast.untyped; import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.util.Lists; import java.util.List; @@ -8,4 +9,10 @@ public record UntypedBlockNode( List<UntypedFunctionStatementNode> statements, Source source ) implements UntypedNode { + public UntypedFunctionStatementBehaviour behaviour() { + var lastStatement = Lists.last(statements); + return lastStatement + .map(statement -> statement.behaviour()) + .orElse(UntypedFunctionStatementBehaviour.CONTINUE); + } } diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBranchingExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBranchingExpressionNode.java new file mode 100644 index 00000000..eab2f680 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedBranchingExpressionNode.java @@ -0,0 +1,7 @@ +package org.shedlang.compiler.ast.untyped; + +import java.util.stream.Stream; + +public interface UntypedBranchingExpressionNode { + Stream<UntypedBlockNode> branchBodies(); +} diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java index 96f6172a..c258257c 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedIfNode.java @@ -3,10 +3,18 @@ package org.shedlang.compiler.ast.untyped; import org.shedlang.compiler.sources.Source; import java.util.List; +import java.util.stream.Stream; public record UntypedIfNode( List<UntypedConditionalBranchNode> conditionalBranches, UntypedBlockNode elseBody, Source source -) implements UntypedExpressionNode { +) implements UntypedBranchingExpressionNode, UntypedExpressionNode { + @Override + public Stream<UntypedBlockNode> branchBodies() { + return Stream.concat( + conditionalBranches.stream().map(branch -> branch.body()), + Stream.of(elseBody) + ); + } } diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 184c3fdd..bcd02807 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -205,7 +205,10 @@ public class Parser { var expression = parseTopLevelExpression(tokens); - var isReturn = !tokens.trySkip(TokenType.SYMBOL_SEMICOLON); + var isReturn = expression instanceof UntypedBranchingExpressionNode branchingExpression + // TODO: Check for consistency + ? branchingExpression.branchBodies().findFirst().orElseThrow().behaviour() == UntypedFunctionStatementBehaviour.BLOCK_RETURN + : !tokens.trySkip(TokenType.SYMBOL_SEMICOLON); var end = tokens.position(); var source = start.to(end); |
