aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 20:56:57 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 20:56:57 +0100
commitf623d56599a160d27c0f7e0b48e3b32cb2b3a471 (patch)
tree38c713fcbb3b79943d81babf9bf70af729b13c27 /src/main/java
parent0cf3c519c2b834c1d5709e1e98be54cd98b90eb9 (diff)
Update CLI to print instructions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ShedCompiler.java34
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java9
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java2
3 files changed, 42 insertions, 3 deletions
diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java
index a7949d53..102d7c6f 100644
--- a/src/main/java/org/shedlang/compiler/ShedCompiler.java
+++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java
@@ -2,6 +2,14 @@ package org.shedlang.compiler;
import org.shedlang.compiler.parser.Parser;
import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.stackir.InstructionSerializer;
+import org.shedlang.compiler.stackir.StackCompiler;
+import org.shedlang.compiler.typechecker.TypeChecker;
+import org.shedlang.compiler.typechecker.TypeCheckerContext;
+import org.shedlang.compiler.types.Effects;
+import org.shedlang.compiler.types.FunctionType;
+import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -13,6 +21,7 @@ import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
+import java.util.Map;
import static org.shedlang.compiler.parser.Tokeniser.tokenise;
@@ -27,10 +36,31 @@ public class ShedCompiler {
var sourceContents = Files.readString(sourceFilePath, StandardCharsets.UTF_8);
var source = Sources.file(sourceFilePath.toString(), sourceContents);
+
var tokens = tokenise(source);
- var node = Parser.parseNamespace(tokens);
- System.out.println(node);
+ var untypedNode = Parser.parseNamespace(tokens);
+
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(
+ Map.entry("Io", Types.effectType(Effects.IO)),
+ Map.entry("Unit", Types.metaType(Types.UNIT)),
+
+ Map.entry("print", new FunctionType(
+ List.of(Types.STRING),
+ List.of(),
+ Types.UNIT
+ ))
+ ));
+ var typedNode = TypeChecker.typeCheckNamespace(untypedNode, context);
+
+ var instructions = StackCompiler.compileNamespace(typedNode);
+
+ var builder = new StringBuilder();
+ InstructionSerializer.serializeInstructions(instructions, builder);
+ var instructionsString = builder.toString();
+
+ System.out.println(instructionsString);
System.out.println();
}
}
diff --git a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
index 65f29512..c542b94f 100644
--- a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
+++ b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
@@ -11,6 +11,15 @@ public class InstructionSerializer {
private InstructionSerializer() {
}
+ public static void serializeInstructions(List<Instruction> instructions, StringBuilder builder) {
+ var tree = treeListIndented(
+ instructions.stream()
+ .map(instruction -> toTree(instruction))
+ .toList()
+ );
+ serializeTree(tree, builder, 0);
+ }
+
public static void serialize(Instruction instruction, StringBuilder builder) {
var tree = toTree(instruction);
serializeTree(tree, builder, 0);
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index aa7ad39b..db922eb5 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -249,7 +249,7 @@ public class TypeChecker {
));
}
- static TypedNamespaceNode typeCheckNamespace(
+ public static TypedNamespaceNode typeCheckNamespace(
UntypedNamespaceNode untyped,
TypeCheckerContext context
) {