* 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;
};
/**
// 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
// 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);
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;
}
* 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) {
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;