summaryrefslogtreecommitdiff
path: root/src
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 /src
parentcb630df69c56d5179873c85bef1fef99cd5fe48d (diff)
downloadgolem-3edf6c7c39dea9155f4a34ae8f5091d2a40a2462.tar.gz
enums
Diffstat (limited to 'src')
-rw-r--r--src/main.c31
1 files changed, 31 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)