# HG changeset patch # User William Astle # Date 1565329698 21600 # Node ID c3099c5d9d3ef92e49ea46efd2dcda5fd9b0be7d # Parent 1bd2d590d734c26d965b9bcd540c52236aab418e Add very simple code generator This very simple code generator is definitely not the final form. It is simply a stop-gap for ongoing development. diff -r 1bd2d590d734 -r c3099c5d9d3e Makefile --- a/Makefile Thu Aug 08 23:32:23 2019 -0600 +++ b/Makefile Thu Aug 08 23:48:18 2019 -0600 @@ -108,7 +108,7 @@ lwcc_cpp_objs := $(lwcc_cpp_srcs:.c=.o) lwcc_cpp_deps := $(lwcc_cpp_srcs:.c=.d) -lwcc_cc_srcs := cc-main.c tree.c cc-parse.c +lwcc_cc_srcs := cc-main.c tree.c cc-parse.c cc-gencode.c lwcc_cc_srcs := $(addprefix lwcc/,$(lwcc_cc_srcs)) lwcc_cc_objs := $(lwcc_cc_srcs:.c=.o) lwcc_cc_deps := $(lwcc_cc_srcs:.c=.d) diff -r 1bd2d590d734 -r c3099c5d9d3e lwcc/cc-gencode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lwcc/cc-gencode.c Thu Aug 08 23:48:18 2019 -0600 @@ -0,0 +1,51 @@ +/* +lwcc/cc-gencode.c + +Copyright © 2019 William Astle + +This file is part of LWTOOLS. + +LWTOOLS 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. + +This program 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 +this program. If not, see . +*/ + +#include +#include + +#include +#include + +#include "tree.h" + +void generate_code(node_t *n, FILE *output) +{ + node_t *nn; + switch (n -> type) + { + // function definition - output prologue, then statements, then epilogue + case NODE_FUNDEF: + fprintf(output, "_%s\n", n->children->next_child->strval); + generate_code(n->children->next_child->next_child->next_child, output); + fprintf(output, "\trts\n"); + break; + + case NODE_CONST_INT: + fprintf(output, "\tldd #%s\n", n->strval); + break; + + default: + for (nn = n -> children; nn; nn = nn -> next_child) + generate_code(nn, output); + break; + } +} diff -r 1bd2d590d734 -r c3099c5d9d3e lwcc/cc-main.c --- a/lwcc/cc-main.c Thu Aug 08 23:32:23 2019 -0600 +++ b/lwcc/cc-main.c Thu Aug 08 23:48:18 2019 -0600 @@ -37,6 +37,7 @@ node_t *process_file(const char *); static void do_error(const char *f, ...); extern node_t *parse_program(struct preproc_info *pp); +extern void generate_code(node_t *n, FILE *of); node_t *program_tree = NULL; @@ -173,6 +174,10 @@ lw_stringlist_destroy(macrolist); node_display(program_tree, stdout); + + // generate output + generate_code(program_tree, output_fp); + node_destroy(program_tree); exit(retval); } @@ -209,6 +214,7 @@ n = parse_program(pp); preproc_finish(pp); + return n; }