From f522f1d19f71a8554bc1b7ef660c421f180cfbb7 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 20 Jul 2023 16:35:39 +0100 Subject: Add Patio backend --- .../shedlang/compiler/backends/PatioBackend.java | 44 ++++++++++++++++++++++ .../java/org/shedlang/compiler/cli/ShedCli.java | 9 +++++ .../org/shedlang/compiler/patio/PatioCodeGen.java | 18 +++++++++ .../compiler/patio/PatioCodeGenContext.java | 12 ++++-- .../compiler/patio/ast/PatioSerializer.java | 17 +++++++++ 5 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/PatioBackend.java (limited to 'src/main/java') 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> 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 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 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 PatioCodeGenResult 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 -> -- cgit v1.2.3