diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -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); |