diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-10 15:35:03 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-10 15:35:03 +0200 |
commit | ceabe04d92a8eb1d57206fd9138fd6548f5ed3b6 (patch) | |
tree | 8d6105ee8cb50bda553ca5dbf3f94f2c06bd3e40 | |
parent | e999ab159ff54d45f91c8c7c10ee2367a504c233 (diff) | |
download | golem-ceabe04d92a8eb1d57206fd9138fd6548f5ed3b6.tar.gz |
deref
-rw-r--r-- | src/main.c | 28 | ||||
-rwxr-xr-x | testing.sh | 5 |
2 files changed, 29 insertions, 4 deletions
@@ -159,6 +159,7 @@ typedef enum { NOD_OR, // | NOD_XOR, // ^ NOD_NUM, // integer + NOD_DEREF, // [a] NOD_BLOCK_STMT, NOD_EXPR_STMT, NOD_RETURN_STMT, @@ -488,6 +489,14 @@ primary(Token **rest, Token *tok) return node; } + if (equal(tok, "[")) { + tok = tok->next; + Node *node = new_node(NOD_DEREF); + node->lhs = expr(&tok, tok); + *rest = skip(tok, "]"); + return node; + } + if (tok->type == TOK_NUM) { Node *node = new_num(tok->val); *rest = tok->next; @@ -645,6 +654,7 @@ static void gen_expr(Node *node); static void gen_globaldec(Node *node); static void gen_fncall(Node *node); static void gen_variableget(Node *node); +static void gen_deref(Node *node); static void gen_expr(Node *node) @@ -665,6 +675,11 @@ gen_expr(Node *node) return; } + if (node->type == NOD_DEREF) { + gen_deref(node); + return; + } + gen_expr(node->lhs); gen_expr(node->rhs); @@ -695,12 +710,12 @@ gen_globaldec(Node *node) { printf("@__gl_%.*s\n", node->len, node->loc); if (node->lhs != NULL) { - printf("\tLIT ,__gla_%.*s\n", node->len, node->loc); + printf("\t,__gla_%.*s\n", node->len, node->loc); printf("@__gla_%.*s\n", node->len, node->loc); for (int i = 0; i < node->lhs->val; i++) - printf("\tLIT %04x\n", node->val); + printf("\t%04x\n", node->val); } else - printf("\tLIT %04x\n", node->val); + printf("\t%04x\n", node->val); } static void @@ -734,6 +749,13 @@ gen_variableget(Node *node) } static void +gen_deref(Node *node) +{ + gen_expr(node->lhs); + printf("\tLDA\n"); +} + +static void gen_stmt(Node *node, Node *fname, int break_lbl) { static int label = 0; @@ -27,5 +27,8 @@ test "$1" "main() { wrt(add('A' - 'a', 'u')); wrt('\n'); } add(a, b) { return a test "$1" "main() return 0;" test "$1" "main() { { wrt('c'); } { wrt('b'); { wrt('A'); } wrt('B'); } wrt('\n'); }" test "$1" "main() { local i; i = '0'; loop { wrt i; i = i + 1; if (i > '9') break; } wrt '\n'; }" -test "$1" "global a[5]; main() {}" +test "$1" "global a[5] = 4; main() { wrt([a] + '0'); wrt '\n'; }" +test "$1" "global a[5] = 4; main() { wrt([a + 1] + '0'); wrt '\n'; }" +test "$1" "global a[5] = 4; main() { wrt([a + 4] + '0'); wrt '\n'; }" +test "$1" "global a[5] = 4; main() { wrt([a + 5] + '0'); wrt '\n'; }" rm -f build/tmp.* |