summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-10 14:30:13 +0200
committerkdx <kikoodx@paranoici.org>2023-06-10 14:30:13 +0200
commit48696f476b85f42ea3c8ff5aa4248ee518c5a18f (patch)
tree34734c8891f1278f5163974a85d456287a8bcb19 /src
parentd376c5605a94663f3720fba6516b8804e82313c7 (diff)
downloadgolem-48696f476b85f42ea3c8ff5aa4248ee518c5a18f.tar.gz
ifelse works
Diffstat (limited to 'src')
-rw-r--r--src/main.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index ccd7643..813ec02 100644
--- a/src/main.c
+++ b/src/main.c
@@ -561,14 +561,16 @@ static Node *
ifelse_stmt(Token **rest, Token *tok)
{
tok = skip(tok, "if");
- Node *const node = new_unary(NOD_IFELSE_STMT, stmt(&tok, tok));
+ Node *const node = new_node(NOD_IFELSE_STMT);
+ node->lhs = expr(&tok, tok);
+ node->rhs = stmt(&tok, tok);
if (equal(tok, "else")) {
tok = tok->next;
- node->rhs = stmt(&tok, tok);
+ node->rhs->next = stmt(&tok, tok);
}
- *rest = skip(tok, ";");
+ *rest = tok;
return node;
}
@@ -676,6 +678,7 @@ gen_variableget(Node *node)
static void
gen_stmt(Node *node, Node *fname)
{
+ static int label = 0;
switch (node->type) {
case NOD_BLOCK_STMT:
node = node->lhs;
@@ -716,9 +719,18 @@ gen_stmt(Node *node, Node *fname)
depth -= 1;
break;
case NOD_IFELSE_STMT:
- gen_stmt(node->lhs, fname);
- if (node->rhs != NULL)
- gen_stmt(node->rhs, fname);
+ gen_expr(node->lhs);
+ printf("\tJEZ ,__lbl_%x\n", label);
+ depth -= 1;
+ gen_stmt(node->rhs, fname);
+ if (node->rhs->next != NULL) {
+ printf("\tJMP ,__lbl_%x\n", label + 1);
+ printf("@__lbl_%x\n", label);
+ gen_stmt(node->rhs->next, fname);
+ label += 1;
+ }
+ printf("@__lbl_%x\n", label);
+ label += 1;
break;
default:
error("unexpected %d", node->type);