summaryrefslogtreecommitdiff
path: root/src
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 /src
parente999ab159ff54d45f91c8c7c10ee2367a504c233 (diff)
downloadgolem-ceabe04d92a8eb1d57206fd9138fd6548f5ed3b6.tar.gz
deref
Diffstat (limited to 'src')
-rw-r--r--src/main.c28
1 files changed, 25 insertions, 3 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;