diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-10 02:05:40 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-10 02:05:40 +0200 |
commit | 9f1ca76dc328479986a77f230f3b6a5866d53761 (patch) | |
tree | 1f86bf3bc4cf13990fd6c36838e4ba2b4c994d4a | |
parent | 7c0d15878c7e9ed459bebd10737499b9667f6b21 (diff) | |
download | golem-9f1ca76dc328479986a77f230f3b6a5866d53761.tar.gz |
turn wrt into a statement
-rw-r--r-- | src/main.c | 28 |
1 files changed, 21 insertions, 7 deletions
@@ -158,6 +158,7 @@ typedef enum { NOD_NUM, // integer NOD_EXPR_STMT, NOD_RETURN_STMT, + NOD_WRT_STMT, NOD_ASSIGN_STMT, NOD_FUN, NOD_WORD, @@ -232,6 +233,7 @@ static Node *global(Token **rest, Token *tok); static Node *expr(Token **rest, Token *tok); static Node *expr_stmt(Token **rest, Token *tok); static Node *return_stmt(Token **rest, Token *tok); +static Node *wrt_stmt(Token **rest, Token *tok); static Node *assign_stmt(Token **rest, Token *tok); static Node *equality(Token **rest, Token *tok); static Node *relational(Token **rest, Token *tok); @@ -444,6 +446,8 @@ stmt(Token **rest, Token *tok) { if (equal(tok, "return")) return return_stmt(rest, tok); + if (equal(tok, "wrt")) + return wrt_stmt(rest, tok); if (equal(tok->next, "=")) return assign_stmt(rest, tok); return expr_stmt(rest, tok); @@ -467,6 +471,15 @@ static Node } static Node +*wrt_stmt(Token **rest, Token *tok) +{ + tok = skip(tok, "wrt"); + Node *const node = new_unary(NOD_WRT_STMT, expr(&tok, tok)); + *rest = skip(tok, ";"); + return node; +} + +static Node *assign_stmt(Token **rest, Token *tok) { expect(tok, TOK_WORD); @@ -557,13 +570,9 @@ gen_fncall(Node *node) depth -= 1; cur = cur->next; } - if (node_equal(node, "wrt")) { - printf("\tWRT\n\tLIT 0000\n"); - depth += 1; - } else { - printf("\tJRT ,__fn_%.*s\n", node->len, node->loc); - depth += 1; - } + + printf("\tJRT ,__fn_%.*s\n", node->len, node->loc); + depth += 1; } static void @@ -592,6 +601,11 @@ gen_function(Node *node) printf("\tRET\n"); depth -= 1; break; + case NOD_WRT_STMT: + gen_expr(node->lhs); + printf("\tWRT\n"); + depth -= 1; + break; case NOD_ASSIGN_STMT: gen_expr(node->rhs); printf("\tLIT ,__gl_%.*s\n\tSTA\n", |