summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-10 02:05:40 +0200
committerkdx <kikoodx@paranoici.org>2023-06-10 02:05:40 +0200
commit9f1ca76dc328479986a77f230f3b6a5866d53761 (patch)
tree1f86bf3bc4cf13990fd6c36838e4ba2b4c994d4a
parent7c0d15878c7e9ed459bebd10737499b9667f6b21 (diff)
downloadgolem-9f1ca76dc328479986a77f230f3b6a5866d53761.tar.gz
turn wrt into a statement
-rw-r--r--src/main.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/main.c b/src/main.c
index cd7c25e..cfe9833 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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",