aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/PatioBackend.java44
-rw-r--r--src/main/java/org/shedlang/compiler/cli/ShedCli.java9
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java18
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java12
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java17
5 files changed, 96 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/PatioBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
new file mode 100644
index 00000000..0db8579b
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
@@ -0,0 +1,44 @@
+package org.shedlang.compiler.backends;
+
+import org.shedlang.compiler.config.ProjectConfig;
+import org.shedlang.compiler.patio.PatioCodeGen;
+import org.shedlang.compiler.patio.ast.PatioSerializer;
+import org.shedlang.compiler.stackir.instructions.Instruction;
+import org.shedlang.compiler.typechecker.TypeInfo;
+import org.shedlang.compiler.types.NamespaceName;
+
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Map;
+
+public class PatioBackend implements Backend {
+ public void compile(
+ ProjectConfig config,
+ Map<NamespaceName, List<Instruction>> namespaces,
+ TypeInfo typeInfo,
+ Path targetDir
+ ) {
+ System.out.println("main: " + config.main());
+
+ for (var namespaceEntry : namespaces.entrySet()) {
+ var namespaceName = namespaceEntry.getKey();
+ var instructions = namespaceEntry.getValue();
+
+ System.out.println(namespaceName);
+
+ var compilationUnit = PatioCodeGen.generateNamespace(instructions);
+
+ var builder = new StringBuilder();
+ PatioSerializer.serializeCompilationUnit(compilationUnit, builder);
+ var compilationUnitString = builder.toString();
+
+ System.out.println(compilationUnitString);
+ System.out.println();
+ }
+ }
+
+ @Override
+ public String name() {
+ return "generate-instructions";
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/cli/ShedCli.java b/src/main/java/org/shedlang/compiler/cli/ShedCli.java
index 95dfcd95..29f27161 100644
--- a/src/main/java/org/shedlang/compiler/cli/ShedCli.java
+++ b/src/main/java/org/shedlang/compiler/cli/ShedCli.java
@@ -6,6 +6,7 @@ import net.sourceforge.argparse4j.inf.Namespace;
import org.shedlang.compiler.ShedCompiler;
import org.shedlang.compiler.backends.Backends;
import org.shedlang.compiler.backends.GenerateInstructionsBackend;
+import org.shedlang.compiler.backends.PatioBackend;
import org.shedlang.compiler.errors.SourceError;
import java.io.IOException;
@@ -35,6 +36,9 @@ public class ShedCli {
case GENERATE_INSTRUCTIONS -> {
compiler.compile(sourcePath, new GenerateInstructionsBackend());
}
+ case PATIO -> {
+ compiler.compile(sourcePath, new PatioBackend());
+ }
}
}
@@ -53,6 +57,10 @@ public class ShedCli {
generateInstructionsSubParser.setDefault("command", Command.GENERATE_INSTRUCTIONS);
generateInstructionsSubParser.addArgument("source").required(true);
+ var patioSubParser = subparsers.addParser("patio");
+ patioSubParser.setDefault("command", Command.PATIO);
+ patioSubParser.addArgument("source").required(true);
+
try {
return parser.parseArgs(args);
} catch (ArgumentParserException e) {
@@ -65,5 +73,6 @@ public class ShedCli {
private enum Command {
COMPILE,
GENERATE_INSTRUCTIONS,
+ PATIO,
}
}
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
index ef034b20..cce880fe 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
@@ -1,10 +1,12 @@
package org.shedlang.compiler.patio;
+import org.shedlang.compiler.patio.ast.PatioCompilationUnit;
import org.shedlang.compiler.patio.ast.PatioLocalRef;
import org.shedlang.compiler.patio.ast.instructions.PatioIntAdd;
import org.shedlang.compiler.patio.ast.instructions.PatioIntGet;
import org.shedlang.compiler.patio.ast.instructions.PatioReturn;
import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.stackir.instructions.*;
import java.util.ArrayList;
@@ -17,6 +19,22 @@ import static org.shedlang.compiler.util.Lists.reversed;
public class PatioCodeGen {
private PatioCodeGen() {}
+ public static PatioCompilationUnit generateNamespace(
+ List<Instruction> instructions
+ ) {
+ var context = PatioCodeGenContext.EMPTY;
+
+ context = context.createFunction(
+ "init",
+ false,
+ Sources.NULL,
+ initContext -> generateInstructions(instructions, initContext)
+ );
+
+ // TODO: set more appropriate source
+ return context.toCompilationUnit(Sources.NULL);
+ }
+
public static PatioCodeGenContext generateInstructions(
List<Instruction> stackIrInstructions,
PatioCodeGenContext context
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
index c8879c45..b80e96d3 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
@@ -5,10 +5,7 @@ import org.pcollections.PMap;
import org.pcollections.PStack;
import org.pcollections.PVector;
import org.shedlang.compiler.backends.llvm.NameAllocator;
-import org.shedlang.compiler.patio.ast.PatioCompilationUnitElement;
-import org.shedlang.compiler.patio.ast.PatioFunctionDefinition;
-import org.shedlang.compiler.patio.ast.PatioLocal;
-import org.shedlang.compiler.patio.ast.PatioLocalRef;
+import org.shedlang.compiler.patio.ast.*;
import org.shedlang.compiler.patio.ast.instructions.PatioInstruction;
import org.shedlang.compiler.patio.ast.instructions.PatioLocalCopy;
import org.shedlang.compiler.patio.ast.types.PatioType;
@@ -305,4 +302,11 @@ public record PatioCodeGenContext(
private <T> PatioCodeGenResult<T> toResult(T value) {
return new PatioCodeGenResult<>(value, this);
}
+
+ public PatioCompilationUnit toCompilationUnit(Source source) {
+ return new PatioCompilationUnit(
+ new ArrayList<>(this.compilationUnitContext.elementsByName.values()),
+ source
+ );
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
index 3243c3ab..31391ff7 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -12,6 +12,15 @@ import static org.shedlang.compiler.treetext.Trees.*;
public class PatioSerializer {
private PatioSerializer() {}
+ public static void serializeCompilationUnit(
+ PatioCompilationUnit compilationUnit,
+ StringBuilder builder
+ ) {
+ // TODO: test this
+ var tree = compilationUnitToTree(compilationUnit);
+ serializeTree(tree, builder, 0);
+ }
+
public static void serializeCompilationUnitElement(
PatioCompilationUnitElement element,
StringBuilder builder
@@ -48,6 +57,14 @@ public class PatioSerializer {
serializeTree(tree, builder, 0);
}
+ private static Tree compilationUnitToTree(PatioCompilationUnit compilationUnit) {
+ return treeListIndented(
+ compilationUnit.elements().stream()
+ .map(element -> compilationUnitElementToTree(element))
+ .toList()
+ );
+ }
+
private static Tree compilationUnitElementToTree(PatioCompilationUnitElement element) {
return switch (element) {
case PatioFunctionDefinition functionDefinition ->