/* 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); }