summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-14 04:10:46 +0200
committerkdx <kikoodx@paranoici.org>2023-06-14 04:10:46 +0200
commit626accfd7fefdf0b8f79a2c95a881620a9b6bd0f (patch)
tree64ce930d9b7a5aa71f8ade3b27817aa93372d561
parente0be66bbb4920d4ac30cf4a84118c281374feb67 (diff)
downloadgolem-626accfd7fefdf0b8f79a2c95a881620a9b6bd0f.tar.gz
red statement
-rw-r--r--samples/echo.golem9
-rw-r--r--src/main.c19
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;
+ }
+}
diff --git a/src/main.c b/src/main.c
index 84cf8dc..0d1e22c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;