summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-16 15:30:49 +0000
committerkdx <kikoodx@paranoici.org>2023-06-16 15:30:49 +0000
commit6837ab2d68c5fd69cd6fd9038ad8495a098da32a (patch)
tree734563649710a597e2a5c1a6aba913cfb1f14753
parenta7076569d5935e493a5e04a0693a0180b047ad21 (diff)
downloadgolem-6837ab2d68c5fd69cd6fd9038ad8495a098da32a.tar.gz
postfix expression
-rw-r--r--src/main.c28
1 files 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);