diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-12 10:32:21 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-12 10:32:21 +0200 |
commit | 07fe6662c369f85c4fa8c0d4a002bd42258851f0 (patch) | |
tree | 7338e962d31ef38f0e5eed1fafa05ff0b0cde982 | |
parent | 3e52e6d5d508e855c67edf33757299ca8d46c9e4 (diff) | |
download | golem-07fe6662c369f85c4fa8c0d4a002bd42258851f0.tar.gz |
ref generation
-rw-r--r-- | src/main.c | 28 | ||||
-rwxr-xr-x | testing.sh | 2 |
2 files changed, 30 insertions, 0 deletions
@@ -190,6 +190,7 @@ typedef enum { NOD_GLOBAL, NOD_DEFINE, NOD_LOCAL, + NOD_REF, } NodeType; typedef struct Node Node; @@ -542,6 +543,15 @@ primary(Token **rest, Token *tok) return node; } + if (equal(tok, "&")) { + tok = tok->next; + Node *node = new_node(NOD_REF); + expect(tok, TOK_WORD); + node->lhs = new_word(tok); + *rest = tok->next; + return node; + } + if (tok->type == TOK_NUM) { Node *node = new_num(tok->val); *rest = tok->next; @@ -750,6 +760,7 @@ static void gen_fncall(Node *node); static void gen_variableget(Node *node); static void gen_deref(Node *node); static void gen_string(Node *node); +static void gen_ref(Node *node); static void gen_expr(Node *node) @@ -771,6 +782,9 @@ gen_expr(Node *node) case NOD_STRING: gen_string(node); return; + case NOD_REF: + gen_ref(node); + return; default: break; } @@ -869,6 +883,20 @@ gen_string(Node *node) } static void +gen_ref(Node *node) +{ + const int found = node_find(locals, node->lhs); + + if (found != -1) { + printf("\tLIT ,__stack_ptr LDA\n"); + if (locals_size - found - 1) + printf("\tLIT %04x SUB\n", locals_size - found - 1); + } else + printf("\tLIT ,__gl_%.*s\n", node->lhs->len, node->lhs->loc); + depth += 1; +} + +static void gen_assign_stmt(Node *node) { gen_expr(node->rhs); @@ -48,4 +48,6 @@ test "$1" "main() { wrt('0' + (9 <= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (5 >= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (7 >= 7)); wrt '\n'; }" test "$1" "main() { wrt('0' + (9 >= 7)); wrt '\n'; }" +test "$1" "main() { local a; dbg a; inc(&a); dbg a; } inc(p) { [p] = [p] + 1; }" +test "$1" "global a; main() { dbg a; inc(&a); dbg a; } inc(p) { [p] = [p] + 1; }" rm -f build/tmp.* |