diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-14 03:54:46 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-14 04:02:34 +0200 |
commit | e0be66bbb4920d4ac30cf4a84118c281374feb67 (patch) | |
tree | 292d7272763693a03c09991744886a74714279f4 /src | |
parent | 63ac8d7c6d22721fbe9dc9fdf6f86ae089a8c34a (diff) | |
download | golem-e0be66bbb4920d4ac30cf4a84118c281374feb67.tar.gz |
empty statements
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 18 |
1 files changed, 18 insertions, 0 deletions
@@ -213,6 +213,7 @@ typedef enum { NOD_NUM, // integer NOD_STRING, // "" NOD_DEREF, // [a] + NOD_EMPTY_STMT, NOD_BLOCK_STMT, NOD_EXPR_STMT, NOD_RETURN_STMT, @@ -339,6 +340,7 @@ void define(Token **rest, Token *tok); static Node *global(Token **rest, Token *tok); static Node *local(Token **rest, Token *tok); static Node *expr(Token **rest, Token *tok); +static Node *empty_stmt(Token **rest, Token *tok); static Node *block_stmt(Token **rest, Token *tok); static Node *expr_stmt(Token **rest, Token *tok); static Node *return_stmt(Token **rest, Token *tok); @@ -657,6 +659,8 @@ primary(Token **rest, Token *tok) static Node * stmt(Token **rest, Token *tok) { + if (equal(tok, ";")) + return empty_stmt(rest, tok); if (equal(tok, "{")) return block_stmt(rest, tok); if (equal(tok, "if")) @@ -694,9 +698,21 @@ stmt(Token **rest, Token *tok) } static Node * +empty_stmt(Token **rest, Token *tok) +{ + *rest = skip(tok, ";"); + return new_node(NOD_EMPTY_STMT); +} + +static Node * block_stmt(Token **rest, Token *tok) { tok = skip(tok, "{"); + if (equal(tok, "}")) { + *rest = tok->next; + return new_node(NOD_EMPTY_STMT); + } + Node *const node = new_node(NOD_BLOCK_STMT); Node head = {0}; @@ -1035,6 +1051,8 @@ gen_stmt(Node *node, Node *fname, int break_lbl) static int label = 0; int lbl; switch (node->type) { + case NOD_EMPTY_STMT: + break; case NOD_BLOCK_STMT: node = node->lhs; while (node != NULL) { |