From 07fe6662c369f85c4fa8c0d4a002bd42258851f0 Mon Sep 17 00:00:00 2001 From: kdx Date: Mon, 12 Jun 2023 10:32:21 +0200 Subject: ref generation --- src/main.c | 28 ++++++++++++++++++++++++++++ testing.sh | 2 ++ 2 files changed, 30 insertions(+) diff --git a/src/main.c b/src/main.c index 938860c..4c8ace0 100644 --- a/src/main.c +++ b/src/main.c @@ -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; } @@ -868,6 +882,20 @@ gen_string(Node *node) depth += 1; } +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) { diff --git a/testing.sh b/testing.sh index 11a9290..98b8377 100755 --- a/testing.sh +++ b/testing.sh @@ -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.* -- cgit v1.2.3