diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-11 20:03:13 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-11 20:03:13 +0100 |
| commit | 975e56cb795a42e576a3e44aee155ff3a81b601b (patch) | |
| tree | 7610e73325b76693294e17e5013032977e3dd8c9 /src/main/java | |
| parent | 225ffd949c67664faceca9ab6d9b86b19a8a71dd (diff) | |
Add stubbed LLVM backend
Diffstat (limited to 'src/main/java')
5 files changed, 88 insertions, 18 deletions
diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java index 24455816..8cc102d8 100644 --- a/src/main/java/org/shedlang/compiler/ShedCompiler.java +++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java @@ -1,14 +1,16 @@ package org.shedlang.compiler; +import org.shedlang.compiler.backends.Backend; import org.shedlang.compiler.config.ProjectConfig; 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.stackir.instructions.Instruction; 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.NamespaceName; import org.shedlang.compiler.types.Types; import org.shedlang.compiler.util.P; @@ -19,25 +21,29 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.StreamSupport; import static org.shedlang.compiler.parser.Tokeniser.tokenise; public class ShedCompiler { - public void compile(Path projectRoot) throws IOException { + public void compile(Path projectRoot, Backend backend) throws IOException { var config = ProjectConfig.read(projectRoot); - System.out.println("main: " + config.main()); - var sourceRoot = projectRoot.resolve("src"); var sourceFilePaths = collectSourceFilePaths(sourceRoot); + var namespaces = new LinkedHashMap<NamespaceName, List<Instruction>>(); + for (var sourceFilePath : sourceFilePaths) { - System.out.println(sourceFilePath); + var namespaceNameParts = StreamSupport.stream(sourceRoot.relativize(sourceFilePath).spliterator(), false) + .map(element -> { + var string = element.toString(); + return string.substring(0, string.lastIndexOf('.')); + }) + .toList(); + var namespaceName = new NamespaceName(namespaceNameParts); var sourceContents = Files.readString(sourceFilePath, StandardCharsets.UTF_8); var source = Sources.file(sourceFilePath.toString(), sourceContents); @@ -60,14 +66,10 @@ public class ShedCompiler { 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(); + namespaces.put(namespaceName, instructions); } + + backend.compile(config, namespaces); } private List<Path> collectSourceFilePaths(Path sourceRoot) throws IOException { diff --git a/src/main/java/org/shedlang/compiler/backends/Backend.java b/src/main/java/org/shedlang/compiler/backends/Backend.java new file mode 100644 index 00000000..ef0e31ca --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/Backend.java @@ -0,0 +1,12 @@ +package org.shedlang.compiler.backends; + +import org.shedlang.compiler.config.ProjectConfig; +import org.shedlang.compiler.stackir.instructions.Instruction; +import org.shedlang.compiler.types.NamespaceName; + +import java.util.List; +import java.util.Map; + +public interface Backend { + void compile(ProjectConfig config, Map<NamespaceName, List<Instruction>> namespaces); +} diff --git a/src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java b/src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java new file mode 100644 index 00000000..bd7d5451 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java @@ -0,0 +1,29 @@ +package org.shedlang.compiler.backends; + +import org.shedlang.compiler.config.ProjectConfig; +import org.shedlang.compiler.stackir.InstructionSerializer; +import org.shedlang.compiler.stackir.instructions.Instruction; +import org.shedlang.compiler.types.NamespaceName; + +import java.util.List; +import java.util.Map; + +public class GenerateInstructionsBackend implements Backend { + public void compile(ProjectConfig config, Map<NamespaceName, List<Instruction>> namespaces) { + System.out.println("main: " + config.main()); + + for (var namespaceEntry : namespaces.entrySet()) { + var namespaceName = namespaceEntry.getKey(); + var instructions = namespaceEntry.getValue(); + + System.out.println(namespaceName); + + 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/backends/llvm/LlvmBackend.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java new file mode 100644 index 00000000..4abc46e5 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java @@ -0,0 +1,16 @@ +package org.shedlang.compiler.backends.llvm; + +import org.shedlang.compiler.backends.Backend; +import org.shedlang.compiler.config.ProjectConfig; +import org.shedlang.compiler.stackir.instructions.Instruction; +import org.shedlang.compiler.types.NamespaceName; + +import java.util.List; +import java.util.Map; + +public class LlvmBackend implements Backend { + @Override + public void compile(ProjectConfig config, Map<NamespaceName, List<Instruction>> namespaces) { + throw new UnsupportedOperationException("TODO"); + } +} diff --git a/src/main/java/org/shedlang/compiler/cli/ShedCli.java b/src/main/java/org/shedlang/compiler/cli/ShedCli.java index 169e6e7f..c2106768 100644 --- a/src/main/java/org/shedlang/compiler/cli/ShedCli.java +++ b/src/main/java/org/shedlang/compiler/cli/ShedCli.java @@ -4,6 +4,8 @@ import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; import org.shedlang.compiler.ShedCompiler; +import org.shedlang.compiler.backends.GenerateInstructionsBackend; +import org.shedlang.compiler.backends.llvm.LlvmBackend; import org.shedlang.compiler.errors.SourceError; import java.io.IOException; @@ -27,11 +29,13 @@ public class ShedCli { var compiler = new ShedCompiler(); switch (args.<Command>get("command")) { + case COMPILE -> { + compiler.compile(sourcePath, new LlvmBackend()); + } case GENERATE_INSTRUCTIONS -> { - compiler.compile(sourcePath); + compiler.compile(sourcePath, new GenerateInstructionsBackend()); } } - } private static Namespace parseArgs(String[] args) { @@ -40,6 +44,12 @@ public class ShedCli { var subparsers = parser.addSubparsers(); + var compileSubParser = subparsers.addParser("compile"); + compileSubParser.setDefault("command", Command.COMPILE); + compileSubParser.addArgument("source").required(true); + compileSubParser.addArgument("--backend").choices("llvm").required(true); + compileSubParser.addArgument("-o", "--output").dest("output").required(true); + var generateInstructionsSubParser = subparsers.addParser("generate-instructions"); generateInstructionsSubParser.setDefault("command", Command.GENERATE_INSTRUCTIONS); generateInstructionsSubParser.addArgument("source").required(true); @@ -54,6 +64,7 @@ public class ShedCli { } private enum Command { + COMPILE, GENERATE_INSTRUCTIONS, } } |
