aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/stackir
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 15:59:25 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 15:59:25 +0100
commit33cec419ce442aaaf8559abdd5920cd61699104e (patch)
treea549e8774c0bd9aac1c09dd48469a29e0088ebad /src/main/java/org/shedlang/compiler/stackir
parent363cf48c00910afbe75107549372968ea1ba23b7 (diff)
Compile function definition into stack instructions
Diffstat (limited to 'src/main/java/org/shedlang/compiler/stackir')
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
index 4623bc5d..406da12c 100644
--- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
+++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
@@ -59,6 +59,26 @@ public class StackCompiler {
private static PVector<Instruction> compileExpressionStatement(TypedExpressionStatementNode node) {
return compileExpression(node.expression()).plus(new DiscardInstruction(node.source()));
}
+
+ private static PVector<Instruction> compileFunctionDefinition(TypedFunctionDefinitionNode node) {
+ var defineFunctionInstruction = new DefineFunctionInstruction(
+ node.name(),
+ node.params().positional().stream()
+ .map(param -> new DefineFunctionInstruction.Param(param.name(), param.source()))
+ .toList(),
+ node.params().named().stream()
+ .map(param -> new DefineFunctionInstruction.Param(param.name(), param.source()))
+ .toList(),
+ node.body().stream()
+ .flatMap(statement -> compileFunctionStatement(statement).stream())
+ .toList(),
+ node.source()
+ );
+
+ var storeInstruction = new LocalStoreInstruction(node.name(), node.source());
+
+ return P.vector(defineFunctionInstruction, storeInstruction);
+ }
public static PVector<Instruction> compileFunctionStatement(TypedFunctionStatementNode node) {
return switch (node) {
@@ -71,6 +91,13 @@ public class StackCompiler {
return P.vector(new PushIntInstruction(node.value(), node.source()));
}
+ public static PVector<Instruction> compileNamespaceStatement(TypedNamespaceStatementNode node) {
+ return switch (node) {
+ case TypedFunctionDefinitionNode functionDefinition ->
+ compileFunctionDefinition(functionDefinition);
+ };
+ }
+
private static PVector<Instruction> compileReference(TypedReferenceNode node) {
return P.vector(new LocalLoadInstruction(node.name(), node.source()));
}