From 1a7c4eba61bd9c055c2e3e19fffbae10b5317197 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 14 Jul 2023 21:43:06 +0100 Subject: Handle ifs with multiple conditional branches --- .../shedlang/compiler/stackir/StackCompiler.java | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index e062ab78..85d3cc5a 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -4,6 +4,7 @@ import org.pcollections.PVector; import org.shedlang.compiler.ShedBuiltins; import org.shedlang.compiler.ast.typed.*; import org.shedlang.compiler.stackir.instructions.*; +import org.shedlang.compiler.util.Lists; import org.shedlang.compiler.util.P; import org.shedlang.compiler.util.PCollectors; @@ -164,16 +165,21 @@ public class StackCompiler { } private static PVector compileIf(TypedIfNode node) { - var conditionalBranch = node.conditionalBranches().get(0); - var conditionInstructions = compileExpression(conditionalBranch.condition()); + var instructions = compileBlock(node.elseBody()); - var ifInstruction = new IfInstruction( - compileBlock(conditionalBranch.body()), - compileBlock(node.elseBody()), - node.source() - ); + for (var conditionalBranch : Lists.reversed(node.conditionalBranches())) { + var conditionInstructions = compileExpression(conditionalBranch.condition()); + + var ifInstruction = new IfInstruction( + compileBlock(conditionalBranch.body()), + instructions, + node.source() + ); - return conditionInstructions.plus(ifInstruction); + instructions = conditionInstructions.plus(ifInstruction); + } + + return instructions; } private static PVector compileIntLiteral(TypedIntLiteralNode node) { -- cgit v1.2.3