summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-10 15:09:52 +0200
committerkdx <kikoodx@paranoici.org>2023-06-10 15:09:52 +0200
commite999ab159ff54d45f91c8c7c10ee2367a504c233 (patch)
treefae2607121e523059a6464add123dc855eedd545
parent11a2e237efbadd3877f94e4352bc894ef9e77a2b (diff)
downloadgolem-e999ab159ff54d45f91c8c7c10ee2367a504c233.tar.gz
global array
-rw-r--r--src/main.c17
-rwxr-xr-xtesting.sh1
2 files changed, 16 insertions, 2 deletions
diff --git a/src/main.c b/src/main.c
index a67f00c..3c39975 100644
--- a/src/main.c
+++ b/src/main.c
@@ -87,7 +87,7 @@ is_punct(const char *p)
if (strchr("=!<>", p[0]) != NULL && p[1] == '=')
return 2;
- return (strchr("+-/*()<>,;{}=", p[0]) != NULL);
+ return (strchr("+-/*()<>,;{}[]=", p[0]) != NULL);
}
static Token *
@@ -324,6 +324,13 @@ global(Token **rest, Token *tok)
node->type = NOD_GLOBAL;
tok = tok->next;
+
+ if (equal(tok, "[")) {
+ tok = tok->next;
+ node->lhs = new_num(get_number(tok));
+ tok = skip(tok->next, "]");
+ }
+
if (equal(tok, "=")) {
tok = tok->next;
node->val = get_number(tok);
@@ -687,7 +694,13 @@ static void
gen_globaldec(Node *node)
{
printf("@__gl_%.*s\n", node->len, node->loc);
- printf("\tLIT %04x\n", node->val);
+ if (node->lhs != NULL) {
+ printf("\tLIT ,__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);
+ } else
+ printf("\tLIT %04x\n", node->val);
}
static void
diff --git a/testing.sh b/testing.sh
index ca7f5e0..aa91e43 100755
--- a/testing.sh
+++ b/testing.sh
@@ -27,4 +27,5 @@ 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() {}"
rm -f build/tmp.*