diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-10 14:30:13 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-10 14:30:13 +0200 |
commit | 48696f476b85f42ea3c8ff5aa4248ee518c5a18f (patch) | |
tree | 34734c8891f1278f5163974a85d456287a8bcb19 /src | |
parent | d376c5605a94663f3720fba6516b8804e82313c7 (diff) | |
download | golem-48696f476b85f42ea3c8ff5aa4248ee518c5a18f.tar.gz |
ifelse works
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -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); |