diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-14 04:10:46 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-14 04:10:46 +0200 |
commit | 626accfd7fefdf0b8f79a2c95a881620a9b6bd0f (patch) | |
tree | 64ce930d9b7a5aa71f8ade3b27817aa93372d561 | |
parent | e0be66bbb4920d4ac30cf4a84118c281374feb67 (diff) | |
download | golem-626accfd7fefdf0b8f79a2c95a881620a9b6bd0f.tar.gz |
red statement
-rw-r--r-- | samples/echo.golem | 9 | ||||
-rw-r--r-- | src/main.c | 19 |
2 files changed, 28 insertions, 0 deletions
diff --git a/samples/echo.golem b/samples/echo.golem new file mode 100644 index 0000000..7ec6413 --- /dev/null +++ b/samples/echo.golem @@ -0,0 +1,9 @@ +main() { + local a; + loop { + red &a; + if (a == 0xffff) + return; + wrt a; + } +} @@ -221,6 +221,7 @@ typedef enum { NOD_SLP_STMT, NOD_DBG_STMT, NOD_WRT_STMT, + NOD_RED_STMT, NOD_ASSIGN_STMT, NOD_POSTFIX_STMT, NOD_IFELSE_STMT, @@ -348,6 +349,7 @@ static Node *break_stmt(Token **rest, Token *tok); static Node *slp_stmt(Token **rest, Token *tok); static Node *dbg_stmt(Token **rest, Token *tok); static Node *wrt_stmt(Token **rest, Token *tok); +static Node *red_stmt(Token **rest, Token *tok); static Node *postfix_stmt(Token **rest, Token *tok); static Node *assign_stmt(Token **rest, Token *tok); static Node *ifelse_stmt(Token **rest, Token *tok); @@ -667,6 +669,8 @@ stmt(Token **rest, Token *tok) return ifelse_stmt(rest, tok); if (equal(tok, "dbg")) return dbg_stmt(rest, tok); + if (equal(tok, "red")) + return red_stmt(rest, tok); if (equal(tok, "slp")) return slp_stmt(rest, tok); if (equal(tok, "wrt")) @@ -782,6 +786,15 @@ wrt_stmt(Token **rest, Token *tok) } static Node * +red_stmt(Token **rest, Token *tok) +{ + tok = skip(tok, "red"); + Node *const node = new_unary(NOD_RED_STMT, expr(&tok, tok)); + *rest = skip(tok, ";"); + return node; +} + +static Node * postfix_stmt(Token **rest, Token *tok) { Node *lhs; @@ -1092,6 +1105,12 @@ gen_stmt(Node *node, Node *fname, int break_lbl) printf("\tWRT\n"); depth -= 1; break; + case NOD_RED_STMT: + printf("\tRED\n"); + gen_expr(node->lhs); + printf("\tSTA\n"); + depth -= 1; + break; case NOD_ASSIGN_STMT: gen_assign_stmt(node); break; |