Mercurial > hg > index.cgi
changeset 499:c3099c5d9d3e
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.
author | William Astle <lost@l-w.ca> |
---|---|
date | Thu, 08 Aug 2019 23:48:18 -0600 |
parents | 1bd2d590d734 |
children | 733fd05ca2a8 |
files | Makefile lwcc/cc-gencode.c lwcc/cc-main.c |
diffstat | 3 files changed, 58 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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)
--- /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 <http://www.gnu.org/licenses/>. +*/ + +#include <stdio.h> +#include <string.h> + +#include <lw_alloc.h> +#include <lw_string.h> + +#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; + } +}
--- 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; }