aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 10:12:21 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 10:12:21 +0100
commit345b4b4c0b03e2331ffb0b5b33a80bee795e70e2 (patch)
treeb3fcc1fb8c394760429b9d2dd23c6ef5e1e198fa /src
parente7025e11b5718393d776e42ec83bef1521bf8a20 (diff)
Compile string literal to stack instruction
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java7
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java2
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/PushStringInstruction.java6
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/Typed.java4
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/StackCompilerStringLiteralTests.java21
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java7
6 files changed, 45 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
index 33d8f026..93fd5086 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.shedlang.compiler.ast.typed.*;
import org.shedlang.compiler.stackir.instructions.Instruction;
import org.shedlang.compiler.stackir.instructions.PushBoolInstruction;
import org.shedlang.compiler.stackir.instructions.PushIntInstruction;
+import org.shedlang.compiler.stackir.instructions.PushStringInstruction;
import java.util.List;
@@ -27,11 +28,15 @@ public class StackCompiler {
throw new UnsupportedOperationException("TODO");
case TypedStringLiteralNode typedStringLiteralNode ->
- throw new UnsupportedOperationException("TODO");
+ compileStringLiteral(typedStringLiteralNode);
};
}
private static List<Instruction> compileIntLiteral(TypedIntLiteralNode node) {
return List.of(new PushIntInstruction(node.value(), node.source()));
}
+
+ private static List<Instruction> compileStringLiteral(TypedStringLiteralNode node) {
+ return List.of(new PushStringInstruction(node.value(), node.source()));
+ }
}
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 5c5bad79..857d7d6a 100644
--- a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.stackir.instructions;
-public sealed interface Instruction permits PushBoolInstruction, PushIntInstruction {
+public sealed interface Instruction permits PushBoolInstruction, PushIntInstruction, PushStringInstruction {
}
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/PushStringInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/PushStringInstruction.java
new file mode 100644
index 00000000..364e5444
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/PushStringInstruction.java
@@ -0,0 +1,6 @@
+package org.shedlang.compiler.stackir.instructions;
+
+import org.shedlang.compiler.sources.Source;
+
+public record PushStringInstruction(String value, Source source) implements Instruction {
+}
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 ba7199a8..2468449a 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java
@@ -15,4 +15,8 @@ public class Typed {
public static TypedIntLiteralNode intLiteral(int value) {
return new TypedIntLiteralNode(BigInteger.valueOf(value), Sources.NULL);
}
+
+ public static TypedStringLiteralNode stringLiteral(String value) {
+ return new TypedStringLiteralNode(value, Sources.NULL);
+ }
}
diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringLiteralTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringLiteralTests.java
new file mode 100644
index 00000000..2d2e7af1
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringLiteralTests.java
@@ -0,0 +1,21 @@
+package org.shedlang.compiler.stackir;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.typed.Typed;
+
+import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.isPushStringInstruction;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.isSequence;
+
+public class StackCompilerStringLiteralTests {
+ @Test
+ public void stringLiteralIsCompiledToPushStringInstruction() {
+ var node = Typed.stringLiteral("hello");
+
+ var instructions = StackCompiler.compileExpression(node);
+
+ assertThat(instructions, isSequence(
+ isPushStringInstruction("hello")
+ ));
+ }
+}
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 053cf645..f2d153cc 100644
--- a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
+++ b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
@@ -23,4 +23,11 @@ public class InstructionMatchers {
has("value", x -> x.value(), equalTo(BigInteger.valueOf(value)))
);
}
+
+ public static Matcher<Instruction> isPushStringInstruction(String value) {
+ return instanceOf(
+ PushStringInstruction.class,
+ has("value", x -> x.value(), equalTo(value))
+ );
+ }
}