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 /src | |
parent | cb630df69c56d5179873c85bef1fef99cd5fe48d (diff) | |
download | golem-3edf6c7c39dea9155f4a34ae8f5091d2a40a2462.tar.gz |
enums
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 31 |
1 files changed, 31 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) |