From d86f31325ca1343355f81918f0ad449f8788baa1 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Sat, 16 May 2026 10:59:21 +0200 Subject: Commit work in progress changes --- lib/compile.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 lib/compile.c (limited to 'lib/compile.c') diff --git a/lib/compile.c b/lib/compile.c new file mode 100644 index 0000000..ce7b5db --- /dev/null +++ b/lib/compile.c @@ -0,0 +1,73 @@ +/* Aplwc - A Programming Language With Constraints + * + * Copyright (C) 2026 Peter Mikkelsen + * + * This file is part of aplwc. + * + * Aplwc is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aplwc is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with aplwc. If not, see . + */ + +#include +#include +#include +#include "aplwc_internal.h" + +static void compile(struct aplwc_eval_context *, struct aplwc_ast *); +static void emit(struct aplwc_eval_context *, uint64_t instr); +static void emit_t0(struct aplwc_eval_context *, enum aplwc_instr_tag); +static uint64_t encode_t0(enum aplwc_instr_tag); + +void +aplwc_compile(struct aplwc_eval_context *context) +{ + compile(context, context->ast); +} + +static void +compile(struct aplwc_eval_context *context, struct aplwc_ast *node) +{ + context->instrs = context->aplwc->alloc(sizeof(*context->instrs)); + memset(context->instrs, 0, sizeof(*context->instrs)); + + switch(node->tag){ + case APLWC_AST_SYSCMD: + emit_t0(context, APLWC_INSTR_SYSCMD_CALL); + break; + case APLWC_AST_ERROR: + emit_t0(context, APLWC_INSTR_ERROR); + break; + } + + emit_t0(context, APLWC_INSTR_END); +} + +static void +emit(struct aplwc_eval_context *context, uint64_t instr) +{ + context->instrs->n_instrs++; + context->instrs->instrs = context->aplwc->realloc(context->instrs->instrs, sizeof(*context->instrs->instrs) * context->instrs->n_instrs); + + context->instrs->instrs[context->instrs->n_instrs-1] = instr; +} + +static void +emit_t0(struct aplwc_eval_context *context, enum aplwc_instr_tag op) +{ + struct aplwc_instr instr = { + .type = 0, + .op = op, + }; + aplwc_encode_instr(&instr); + emit(context, instr.encoded); +} -- cgit v1.2.3