summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-07-25 10:45:08 +0200
committerkdx <kikoodx@paranoici.org>2023-07-25 10:45:08 +0200
commit3edf6c7c39dea9155f4a34ae8f5091d2a40a2462 (patch)
tree7fa99555f5c78fc9cdde5dc81dba31e6e2bf75b0
parentcb630df69c56d5179873c85bef1fef99cd5fe48d (diff)
downloadgolem-3edf6c7c39dea9155f4a34ae8f5091d2a40a2462.tar.gz
enums
-rw-r--r--src/main.c31
-rwxr-xr-xtesting.sh1
2 files changed, 32 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
index 10a78fc..a022d75 100644
--- a/src/main.c
+++ b/src/main.c
@@ -423,6 +423,7 @@ new_num(int val, Token *tok)
static Node *stmt(Token **rest, Token *tok);
static Node *function(Token **rest, Token *tok);
static void define(Token **rest, Token *tok);
+static void denum(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);
@@ -492,6 +493,31 @@ define(Token **rest, Token *tok)
defines = store;
}
+static void
+denum(Token **rest, Token *tok)
+{
+ tok = skip(tok, "enum");
+ Node *store = new_word(tok);
+ int v = 0;
+ store->rhs = new_num(v++, tok);
+ store->type = NOD_DEFINE;
+ store->next = defines;
+ defines = store;
+ tok = tok->next;
+
+ while (tok->type != TOK_EOF && !equal(tok, ";")) {
+ tok = skip(tok, ",");
+ store = new_word(tok);
+ store->rhs = new_num(v++, tok);
+ store->type = NOD_DEFINE;
+ store->next = defines;
+ defines = store;
+ tok = tok->next;
+ }
+
+ *rest = skip(tok, ";");
+}
+
static int const_expr(Node *node);
static Node *
@@ -1494,6 +1520,11 @@ parse(Token *tok)
continue;
}
+ if (equal(tok, "enum")) {
+ denum(&tok, tok);
+ continue;
+ }
+
if (equal(tok, "global")) {
cur = cur->next = global(&tok, tok);
while (cur->next != NULL)
diff --git a/testing.sh b/testing.sh
index 9a248e7..dce1fea 100755
--- a/testing.sh
+++ b/testing.sh
@@ -67,4 +67,5 @@ test "$1" "main() { local a = 5, b = 7, c; dbg a; dbg b; }"
test "$1" "main() { dbg 5 % 3; }"
test "$1" "main() { dbg [{1, 2, 3} + 2]; dbg [{1, 2, 3}]; }"
test "$1" "main() { err 'u'; }"
+test "$1" "enum a, b, c; main() { dbg a; dbg b; dbg c; }"
rm -f build/tmp.*