From b1fed550bb2f441d2de942bb7b9483ef05882c9a Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Mon, 27 Nov 2023 18:46:20 +0100 Subject: [PATCH] WIP: symbol resolver --- include/ulas.h | 17 ++++++++++++----- src/ulas.c | 15 ++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/include/ulas.h b/include/ulas.h index 5703201..fc9756e 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -227,9 +227,14 @@ struct ulas_preproc { * Symbols */ +enum ulas_syms { ULAS_SYM_FORWARD, ULAS_SYM_DECL }; + +enum ulas_symres { ULAS_EGLOBALUNRESOLVE = 1, ULAS_ELOCALUNRESOLVE = 2 }; + struct ulas_sym { char *name; struct ulas_tok tok; + enum ulas_syms type; }; /** @@ -368,9 +373,11 @@ char *ulas_strndup(const char *src, unsigned long n); // resolve a symbol until an actual literal token (str, int) is found // returns NULL if the symbol cannot be resolved -// and sets rc to -1 if eunresolve is 1 -// if eunresolve is 0 rc will be set to 1 if the symbol is not resolved -struct ulas_tok *ulas_symbolresolve(const char *name, int eunresolve, int *rc); +// returns -1 if any flagged symbol was not found +// if flagged symbols remain unresolved (e.g. global or locals) rc is set to the +// respective flag value +struct ulas_tok *ulas_symbolresolve(const char *name, enum ulas_symres flags, + int *rc); // tokenisze according to pre-defined rules // returns the amount of bytes of line that were @@ -448,9 +455,9 @@ char *ulas_preprocexpand(struct ulas_preproc *pp, const char *raw_line, // convert literal to its int value // retunrs -1 on error, 0 on success and 1 if there is an unresolved symbol -int ulas_valint(struct ulas_tok *lit, int eunresolve, int *rc); +int ulas_valint(struct ulas_tok *lit, enum ulas_symres flags, int *rc); // convert literal to its char value -char *ulas_valstr(struct ulas_tok *lit, int eunresolve, int *rc); +char *ulas_valstr(struct ulas_tok *lit, enum ulas_symres flags, int *rc); struct ulas_tokbuf ulas_tokbuf(void); diff --git a/src/ulas.c b/src/ulas.c index 7cc5d0f..aa6f78b 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -161,7 +161,8 @@ int ulas_isname(const char *tok, unsigned long n) { return 1; } -struct ulas_tok *ulas_symbolresolve(const char *name, int eunresolve, int *rc) { +struct ulas_tok *ulas_symbolresolve(const char *name, enum ulas_symres flags, + int *rc) { // TODO: implement return NULL; } @@ -931,10 +932,14 @@ fail: * Literals, tokens and expressions */ -int ulas_valint(struct ulas_tok *lit, int eunresolve, int *rc) { +int ulas_valint(struct ulas_tok *lit, enum ulas_symres flags, int *rc) { if (lit->type == ULAS_SYMBOL) { - struct ulas_tok *stok = ulas_symbolresolve(lit->val.strv, eunresolve, rc); - return ulas_valint(stok, eunresolve, rc); + struct ulas_tok *stok = ulas_symbolresolve(lit->val.strv, flags, rc); + // bail if symbol is not resolvable + if (*rc == 1) { + return 0; + } + return ulas_valint(stok, flags, rc); } if (!lit || lit->type != ULAS_INT) { @@ -946,7 +951,7 @@ int ulas_valint(struct ulas_tok *lit, int eunresolve, int *rc) { return lit->val.intv; } -char *ulas_valstr(struct ulas_tok *lit, int eunresolve, int *rc) { +char *ulas_valstr(struct ulas_tok *lit, enum ulas_symres flags, int *rc) { if (!lit || lit->type != ULAS_STR) { ULASERR("Expected str\n"); *rc = -1; -- 2.30.2