diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-16 15:30:49 +0000 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-16 15:30:49 +0000 |
commit | 6837ab2d68c5fd69cd6fd9038ad8495a098da32a (patch) | |
tree | 734563649710a597e2a5c1a6aba913cfb1f14753 | |
parent | a7076569d5935e493a5e04a0693a0180b047ad21 (diff) | |
download | golem-6837ab2d68c5fd69cd6fd9038ad8495a098da32a.tar.gz |
postfix expression
-rw-r--r-- | src/main.c | 28 |
1 files changed, 17 insertions, 11 deletions
@@ -301,7 +301,7 @@ typedef enum { NOD_WRT_STMT, NOD_RED_STMT, NOD_ASSIGN_STMT, - NOD_POSTFIX_STMT, + NOD_POSTFIX, NOD_IFELSE_STMT, NOD_LOOP_STMT, NOD_FUN, @@ -430,7 +430,7 @@ 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 *postfix(Token **rest, Token *tok); static Node *assign_stmt(Token **rest, Token *tok); static Node *ifelse_stmt(Token **rest, Token *tok); static Node *loop_stmt(Token **rest, Token *tok); @@ -722,6 +722,10 @@ primary(Token **rest, Token *tok) return node; } + if (tok->type == TOK_WORD && (equal(tok->next, "++") || + equal(tok->next, "--"))) + return postfix(rest, tok); + if (tok->type == TOK_WORD) { /* variable */ Node *node = new_word(tok); @@ -771,8 +775,6 @@ stmt(Token **rest, Token *tok) } if (equal(tok->next, "=")) return assign_stmt(rest, tok); - if (equal(tok->next, "++") || equal(tok->next, "--")) - return postfix_stmt(rest, tok); return expr_stmt(rest, tok); } @@ -876,7 +878,7 @@ red_stmt(Token **rest, Token *tok) } static Node * -postfix_stmt(Token **rest, Token *tok) +postfix(Token **rest, Token *tok) { Token *const og = tok; Node *lhs; @@ -884,8 +886,8 @@ postfix_stmt(Token **rest, Token *tok) lhs = new_word(tok); tok = tok->next; expect(tok, TOK_PUNCT); - Node *const node = new_binary(NOD_POSTFIX_STMT, og, lhs, new_word(tok)); - *rest = skip(tok->next, ";"); + Node *const node = new_binary(NOD_POSTFIX, og, lhs, new_word(tok)); + *rest = tok->next; return node; } @@ -946,6 +948,7 @@ static void gen_variableget(Node *node); static void gen_deref(Node *node); static void gen_string(Node *node); static void gen_ref(Node *node); +static void gen_postfix(Node *node); static void gen_expr(Node *node) @@ -970,6 +973,9 @@ gen_expr(Node *node) case NOD_REF: gen_ref(node); return; + case NOD_POSTFIX: + gen_postfix(node); + return; default: break; } @@ -1158,7 +1164,7 @@ gen_assign_stmt(Node *node) } static void -gen_postfix_stmt(Node *node) +gen_postfix(Node *node) { const int found = node_find(locals, node->lhs); @@ -1172,6 +1178,9 @@ gen_postfix_stmt(Node *node) node->lhs->len, node->lhs->loc); printf("\tLDA\n"); + printf("\tDUP\n"); + depth += 1; + if (node_equal(node->rhs, "++")) printf("\tINC\n"); else if (node_equal(node->rhs, "--")) @@ -1245,9 +1254,6 @@ gen_stmt(Node *node, Node *fname, int break_lbl) case NOD_ASSIGN_STMT: gen_assign_stmt(node); break; - case NOD_POSTFIX_STMT: - gen_postfix_stmt(node); - break; case NOD_IFELSE_STMT: lbl = label; label += 1 + (node->rhs->next != NULL); |