From 6837ab2d68c5fd69cd6fd9038ad8495a098da32a Mon Sep 17 00:00:00 2001 From: kdx Date: Fri, 16 Jun 2023 15:30:49 +0000 Subject: postfix expression --- src/main.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main.c b/src/main.c index 0197bbc..882ef03 100644 --- a/src/main.c +++ b/src/main.c @@ -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); -- cgit v1.2.3