summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-12 10:32:21 +0200
committerkdx <kikoodx@paranoici.org>2023-06-12 10:32:21 +0200
commit07fe6662c369f85c4fa8c0d4a002bd42258851f0 (patch)
tree7338e962d31ef38f0e5eed1fafa05ff0b0cde982
parent3e52e6d5d508e855c67edf33757299ca8d46c9e4 (diff)
downloadgolem-07fe6662c369f85c4fa8c0d4a002bd42258851f0.tar.gz
ref generation
-rw-r--r--src/main.c28
-rwxr-xr-xtesting.sh2
2 files changed, 30 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
index 938860c..4c8ace0 100644
--- a/src/main.c
+++ b/src/main.c
@@ -190,6 +190,7 @@ typedef enum {
NOD_GLOBAL,
NOD_DEFINE,
NOD_LOCAL,
+ NOD_REF,
} NodeType;
typedef struct Node Node;
@@ -542,6 +543,15 @@ primary(Token **rest, Token *tok)
return node;
}
+ if (equal(tok, "&")) {
+ tok = tok->next;
+ Node *node = new_node(NOD_REF);
+ expect(tok, TOK_WORD);
+ node->lhs = new_word(tok);
+ *rest = tok->next;
+ return node;
+ }
+
if (tok->type == TOK_NUM) {
Node *node = new_num(tok->val);
*rest = tok->next;
@@ -750,6 +760,7 @@ static void gen_fncall(Node *node);
static void gen_variableget(Node *node);
static void gen_deref(Node *node);
static void gen_string(Node *node);
+static void gen_ref(Node *node);
static void
gen_expr(Node *node)
@@ -771,6 +782,9 @@ gen_expr(Node *node)
case NOD_STRING:
gen_string(node);
return;
+ case NOD_REF:
+ gen_ref(node);
+ return;
default:
break;
}
@@ -869,6 +883,20 @@ gen_string(Node *node)
}
static void
+gen_ref(Node *node)
+{
+ const int found = node_find(locals, node->lhs);
+
+ if (found != -1) {
+ printf("\tLIT ,__stack_ptr LDA\n");
+ if (locals_size - found - 1)
+ printf("\tLIT %04x SUB\n", locals_size - found - 1);
+ } else
+ printf("\tLIT ,__gl_%.*s\n", node->lhs->len, node->lhs->loc);
+ depth += 1;
+}
+
+static void
gen_assign_stmt(Node *node)
{
gen_expr(node->rhs);
diff --git a/testing.sh b/testing.sh
index 11a9290..98b8377 100755
--- a/testing.sh
+++ b/testing.sh
@@ -48,4 +48,6 @@ test "$1" "main() { wrt('0' + (9 <= 7)); wrt '\n'; }"
test "$1" "main() { wrt('0' + (5 >= 7)); wrt '\n'; }"
test "$1" "main() { wrt('0' + (7 >= 7)); wrt '\n'; }"
test "$1" "main() { wrt('0' + (9 >= 7)); wrt '\n'; }"
+test "$1" "main() { local a; dbg a; inc(&a); dbg a; } inc(p) { [p] = [p] + 1; }"
+test "$1" "global a; main() { dbg a; inc(&a); dbg a; } inc(p) { [p] = [p] + 1; }"
rm -f build/tmp.*