diff options
author | kdx <kikoodx@paranoici.org> | 2023-07-25 10:45:08 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-07-25 10:45:08 +0200 |
commit | 3edf6c7c39dea9155f4a34ae8f5091d2a40a2462 (patch) | |
tree | 7fa99555f5c78fc9cdde5dc81dba31e6e2bf75b0 | |
parent | cb630df69c56d5179873c85bef1fef99cd5fe48d (diff) | |
download | golem-3edf6c7c39dea9155f4a34ae8f5091d2a40a2462.tar.gz |
enums
-rw-r--r-- | src/main.c | 31 | ||||
-rwxr-xr-x | testing.sh | 1 |
2 files changed, 32 insertions, 0 deletions
@@ -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) @@ -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.* |