From 0fc731ad0f750e944513b77abfa0a8938667a31c Mon Sep 17 00:00:00 2001 From: kdx Date: Sun, 11 Jun 2023 03:41:08 +0200 Subject: bad define implementation --- samples/helloworld.golem | 4 +++- src/main.c | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/samples/helloworld.golem b/samples/helloworld.golem index 9ec0086..473331f 100644 --- a/samples/helloworld.golem +++ b/samples/helloworld.golem @@ -1,5 +1,7 @@ global str[32]; +define iterations = 9; + main() { local i; @@ -9,7 +11,7 @@ main() { i = 0; loop { i = i + 1; - if (i > 9) + if (i > iterations) break; print(str); uprint(str); diff --git a/src/main.c b/src/main.c index 8dfdfb9..eaa4bf3 100644 --- a/src/main.c +++ b/src/main.c @@ -186,6 +186,7 @@ typedef enum { NOD_WORD, NOD_FNCALL, NOD_GLOBAL, + NOD_DEFINE, NOD_LOCAL, } NodeType; @@ -239,6 +240,14 @@ node_find(const Node *node, Node *op) return -1; } +static Node * +node_get(Node *node, int idx) +{ + while (idx--) + node = node->next; + return node; +} + static Node * new_node(NodeType type) { @@ -285,6 +294,7 @@ new_num(int val) static Node *stmt(Token **rest, Token *tok); static Node *function(Token **rest, Token *tok); +void define(Token **rest, Token *tok); static Node *global(Token **rest, Token *tok); static Node *local(Token **rest, Token *tok); static Node *expr(Token **rest, Token *tok); @@ -306,6 +316,7 @@ static Node *primary(Token **rest, Token *tok); static Node *locals; static int locals_size; static Node *strings; +static Node *defines; static int strings_size; static Node * @@ -333,6 +344,20 @@ function(Token **rest, Token *tok) return node; } +void +define(Token **rest, Token *tok) +{ + tok = skip(tok, "define"); + Node *store = new_word(tok); + tok = skip(tok->next, "="); + store->val = get_number(tok); + *rest = skip(tok->next, ";"); + + store->type = NOD_DEFINE; + store->next = defines; + defines = store; +} + static Node * global(Token **rest, Token *tok) { @@ -783,8 +808,12 @@ gen_fncall(Node *node) static void gen_variableget(Node *node) { + const int define_idx = node_find(defines, node); const int found = node_find(locals, node); - if (found != -1) { + + if (define_idx != -1) + printf("\tLIT %04x\n", node_get(defines, define_idx)->val); + else if (found != -1) { printf("\tLIT ,__stack_ptr LDA\n"); if (locals_size - found - 1) printf("\tLIT %04x SUB\n", locals_size - found - 1); @@ -995,6 +1024,11 @@ parse(Token *tok) Node head = {0}; Node *cur = &head; while (tok->type != TOK_EOF) { + if (equal(tok, "define")) { + define(&tok, tok); + continue; + } + if (equal(tok, "global")) { cur = cur->next = global(&tok, tok); continue; -- cgit v1.2.3