summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-10 15:35:03 +0200
committerkdx <kikoodx@paranoici.org>2023-06-10 15:35:03 +0200
commitceabe04d92a8eb1d57206fd9138fd6548f5ed3b6 (patch)
tree8d6105ee8cb50bda553ca5dbf3f94f2c06bd3e40
parente999ab159ff54d45f91c8c7c10ee2367a504c233 (diff)
downloadgolem-ceabe04d92a8eb1d57206fd9138fd6548f5ed3b6.tar.gz
deref
-rw-r--r--src/main.c28
-rwxr-xr-xtesting.sh5
2 files changed, 29 insertions, 4 deletions
diff --git a/src/main.c b/src/main.c
index 3c39975..f7c8eee 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;
diff --git a/testing.sh b/testing.sh
index aa91e43..8894762 100755
--- a/testing.sh
+++ b/testing.sh
@@ -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.*