aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-11 20:03:13 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-11 20:03:13 +0100
commit975e56cb795a42e576a3e44aee155ff3a81b601b (patch)
tree7610e73325b76693294e17e5013032977e3dd8c9 /src/main/java
parent225ffd949c67664faceca9ab6d9b86b19a8a71dd (diff)
Add stubbed LLVM backend
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/backends/Backend.java12
-rw-r--r--src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java29
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java16
-rw-r--r--src/main/java/org/shedlang/compiler/cli/ShedCli.java15
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,
}
}