summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-14 03:54:46 +0200
committerkdx <kikoodx@paranoici.org>2023-06-14 04:02:34 +0200
commite0be66bbb4920d4ac30cf4a84118c281374feb67 (patch)
tree292d7272763693a03c09991744886a74714279f4
parent63ac8d7c6d22721fbe9dc9fdf6f86ae089a8c34a (diff)
downloadgolem-e0be66bbb4920d4ac30cf4a84118c281374feb67.tar.gz
empty statements
-rw-r--r--src/main.c18
-rwxr-xr-xtesting.sh17
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"))
@@ -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) {
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.*