From 9cc55f4c51903afbf46a2fbe7725d9aa855f795d Mon Sep 17 00:00:00 2001 From: kdx Date: Sat, 17 Jun 2023 06:42:32 +0200 Subject: local dec optionnal init --- src/main.c | 33 +++++++++++++++++++++++++++++++-- testing.sh | 1 + 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 882ef03..bfaeee8 100644 --- a/src/main.c +++ b/src/main.c @@ -516,7 +516,14 @@ local(Token **rest, Token *tok) { tok = skip(tok, "local"); Node *const node = new_unary(NOD_LOCAL, tok, new_word(tok)); - *rest = skip(tok->next, ";"); + tok = tok->next; + + if (equal(tok, "=")) { + tok = tok->next; + node->rhs = expr(&tok, tok); + } + + *rest = skip(tok, ";"); return node; } @@ -943,6 +950,7 @@ static int depth; static void gen_expr(Node *node); static void gen_globaldec(Node *node); +static void gen_localdec(Node *node); static void gen_fncall(Node *node); static void gen_variableget(Node *node); static void gen_deref(Node *node); @@ -1023,6 +1031,21 @@ gen_globaldec(Node *node) printf("\t%04x\n", node->val); } +static void +gen_localdec(Node *node) +{ + if (node->rhs == NULL) + return; + + const int found = node_find(locals, node->lhs); + printf("\tLIT %04x\n", const_expr(node->rhs)); + printf("\tLIT ,__stack_ptr LDA\n"); + if (locals_size - found - 1) + printf("\tLIT %04x SUB\n", + locals_size - found - 1); + printf("\tSTA\n"); +} + static void gen_fncall(Node *node) { @@ -1298,8 +1321,11 @@ gen_function(Node *node) if (node->type == NOD_BLOCK_STMT) node = node->lhs; - while (node->type == NOD_LOCAL) { + Node localdecshead = {0}; + Node *localdecs = &localdecshead; + while (node != NULL && node->type == NOD_LOCAL) { cur = cur->next = node->lhs; + localdecs = localdecs->next = node; node = node->next; } locals = head.next; @@ -1323,6 +1349,9 @@ gen_function(Node *node) cur = cur->next; } + for (cur = localdecshead.next; cur != NULL; cur = cur->next) + gen_localdec(cur); + while (node != NULL) { gen_stmt(node, ognode->lhs, -1); node = node->next; diff --git a/testing.sh b/testing.sh index fe19039..21f28ec 100755 --- a/testing.sh +++ b/testing.sh @@ -55,6 +55,7 @@ test "$1" "main() 0; //ayayayayayayaya comment" test "$1" "main() return;" test "$1" "main() { local a; a = 5; dbg a; a++; dbg a; }" test "$1" "main() { local a; a = 5; dbg a; a--; dbg a; }" +test "$1" "main() { local a = 5; dbg a; a--; dbg a; }" test "$1" "main() { wrt [\"(\"]; wrt '\n'; }" test "$1" "main() { wrt inc('0') |> dec() |> inc() |> inc(); wrt '\n'; } inc(a) return a + 1; dec(a) return a - 1;" test "$1" "main();" -- cgit v1.2.3