diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 20:56:57 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 20:56:57 +0100 |
| commit | f623d56599a160d27c0f7e0b48e3b32cb2b3a471 (patch) | |
| tree | 38c713fcbb3b79943d81babf9bf70af729b13c27 /src/main/java | |
| parent | 0cf3c519c2b834c1d5709e1e98be54cd98b90eb9 (diff) | |
Update CLI to print instructions
Diffstat (limited to 'src/main/java')
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 ) { |
