From ff4dad7fc61d13aee7ed1191cc3afd9a8a75a240 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Jun 2023 12:04:59 +0100 Subject: Compile expression statements to stack instructions --- .../shedlang/compiler/stackir/StackCompiler.java | 11 ++++++++++ .../stackir/instructions/DiscardInstruction.java | 6 ++++++ .../compiler/stackir/instructions/Instruction.java | 2 +- .../org/shedlang/compiler/ast/typed/Typed.java | 4 ++++ .../StackCompilerExpressionStatementTests.java | 24 ++++++++++++++++++++++ .../stackir/instructions/InstructionMatchers.java | 6 ++++++ .../TypeCheckerExpressionStatementTests.java | 8 -------- 7 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/stackir/instructions/DiscardInstruction.java create mode 100644 src/test/java/org/shedlang/compiler/stackir/StackCompilerExpressionStatementTests.java (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index c16674e0..4623bc5d 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -56,6 +56,17 @@ public class StackCompiler { }; } + private static PVector compileExpressionStatement(TypedExpressionStatementNode node) { + return compileExpression(node.expression()).plus(new DiscardInstruction(node.source())); + } + + public static PVector compileFunctionStatement(TypedFunctionStatementNode node) { + return switch (node) { + case TypedExpressionStatementNode expressionStatement -> + compileExpressionStatement(expressionStatement); + }; + } + private static PVector compileIntLiteral(TypedIntLiteralNode node) { return P.vector(new PushIntInstruction(node.value(), node.source())); } diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/DiscardInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/DiscardInstruction.java new file mode 100644 index 00000000..6efd3c03 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/DiscardInstruction.java @@ -0,0 +1,6 @@ +package org.shedlang.compiler.stackir.instructions; + +import org.shedlang.compiler.sources.Source; + +public record DiscardInstruction(Source source) implements Instruction { +} diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java index 33007bf2..0b5d9dd8 100644 --- a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.stackir.instructions; public sealed interface Instruction - permits CallInstruction, LocalLoadInstruction, LocalStoreInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction { + permits CallInstruction, DiscardInstruction, LocalLoadInstruction, LocalStoreInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction { } diff --git a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java index ed58b4d4..80c02765 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java @@ -29,6 +29,10 @@ public class Typed { ); } + public static TypedExpressionStatementNode expressionStatement(TypedExpressionNode expression) { + return new TypedExpressionStatementNode(expression, Sources.NULL); + } + public static TypedIntLiteralNode intLiteral(int value) { return new TypedIntLiteralNode(BigInteger.valueOf(value), Sources.NULL); } diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerExpressionStatementTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerExpressionStatementTests.java new file mode 100644 index 00000000..a408f19d --- /dev/null +++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerExpressionStatementTests.java @@ -0,0 +1,24 @@ +package org.shedlang.compiler.stackir; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.ast.typed.Typed; + +import java.util.List; + +import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.*; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.isSequence; + +public class StackCompilerExpressionStatementTests { + @Test + public void expressionIsEvaluatedAndTheResultDiscarded() { + var node = Typed.expressionStatement(Typed.stringLiteral("hello")); + + var instructions = StackCompiler.compileFunctionStatement(node); + + assertThat(instructions, isSequence( + isPushStringInstruction("hello"), + isDiscardInstruction() + )); + } +} diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java index c9cd8621..3863c2f9 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java @@ -19,6 +19,12 @@ public class InstructionMatchers { ); } + public static Matcher isDiscardInstruction() { + return instanceOf( + DiscardInstruction.class + ); + } + public static Matcher isLocalLoadInstruction(String name) { return instanceOf( LocalLoadInstruction.class, diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java index 29175665..a475ed6c 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java @@ -1,19 +1,11 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; -import org.shedlang.compiler.ast.typed.Typed; import org.shedlang.compiler.ast.untyped.Untyped; -import org.shedlang.compiler.typechecker.errors.UnknownVariableError; -import org.shedlang.compiler.types.Types; -import org.shedlang.compiler.util.P; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedExpressionStatementNode; import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedStringLiteralNode; import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.equalTo; public class TypeCheckerExpressionStatementTests { @Test -- cgit v1.2.3