From e0be66bbb4920d4ac30cf4a84118c281374feb67 Mon Sep 17 00:00:00 2001 From: kdx Date: Wed, 14 Jun 2023 03:54:46 +0200 Subject: empty statements --- src/main.c | 18 ++++++++++++++++++ testing.sh | 17 ++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index ea7e8ec..84cf8dc 100644 --- a/src/main.c +++ b/src/main.c @@ -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")) @@ -693,10 +697,22 @@ stmt(Token **rest, Token *tok) return expr_stmt(rest, 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) { diff --git a/testing.sh b/testing.sh index 9781638..fe19039 100755 --- a/testing.sh +++ b/testing.sh @@ -13,14 +13,14 @@ test() { } tup -q || ./build.sh || exit 1 -test "$1" "main(){5 + 2; return 4;}" -test "$1" "main(){6 + 3;}" -test "$1" "main(){'a' - 'b';}" -test "$1" "main(){ buzz(); } buzz() { return 42; }" -test "$1" "main(){ fizz(50 + buzz() - 3) * 4; } fizz() { return 3; } buzz() { return 42; }" +test "$1" "main() {5 + 2; return 4;}" +test "$1" "main() {6 + 3;}" +test "$1" "main() {'a' - 'b';}" +test "$1" "main() { buzz(); } buzz() { return 42; }" +test "$1" "main() { fizz(50 + buzz() - 3) * 4; } fizz() { return 3; } buzz() { return 42; }" test "$1" "global abc; main(){ return abc; }" -test "$1" "global abc = 5; main(){ return abc; }" -test "$1" "main(){ return abc; } global abc = 5;" +test "$1" "global abc = 5; main() { return abc; }" +test "$1" "main() { return abc; } global abc = 5;" test "$1" "global abc = 5; main(){ inc(); return abc; } inc() { abc = abc + 1; }" test "$1" "main() { wrt('H'); wrt('e'); wrt('l'); wrt('l'); wrt('o'); wrt('!'); wrt('\n'); }" test "$1" "main() { a(a(0)); } a(x) { return x + 1; }" @@ -57,4 +57,7 @@ test "$1" "main() { local a; a = 5; dbg a; a++; dbg a; }" test "$1" "main() { local a; a = 5; dbg a; a--; dbg a; }" test "$1" "main() { wrt [\"(\"]; wrt '\n'; }" test "$1" "main() { wrt inc('0') |> dec() |> inc() |> inc(); wrt '\n'; } inc(a) return a + 1; dec(a) return a - 1;" +test "$1" "main();" +test "$1" "main() {}" +test "$1" "main() {;;;;;;;;;;;;;;;;;}" rm -f build/tmp.* -- cgit v1.2.3