diff options
Diffstat (limited to 'src/main/java/org/shedlang/compiler/stackir')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/stackir/StackCompiler.java | 27 |
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())); } |
