From af3f2ebc42bf9dc64fc581b9f8f79e98895cb417 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 30 Oct 2021 10:13:11 +0200 Subject: Add hashtable for Environment tracking --- src/parser.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index 2215fad..e16fc4a 100644 --- a/src/parser.c +++ b/src/parser.c @@ -4,6 +4,15 @@ static Object **objects = NULL; static Root *roots = NULL; + +uint64_t +symbol_hash(const HashTable *table, void *key) { + Object *obj = key; + uint64_t hash = _xor_shift_hash(obj->text, array_size(obj->text)); + hash = _fibonacci_hash(hash, table->shift_amount); + return hash; +} + Token peek_token(const Parser *parser) { return parser->tokens[parser->current]; @@ -391,6 +400,16 @@ parse(Token *tokens, Errors *errors) { array_push(roots, root); } + // TEST INSERTION/LOOKUP. + HashTable *table = ht_init(symbol_hash, object_equal); + ht_insert(table, &roots[0][0], &roots[1][0]); + ht_insert(table, &roots[2][0], &roots[3][0]); + Object *val = ht_lookup(table, &roots[2][0]); + object_display(val); + val = ht_lookup(table, &roots[0][0]); + object_display(val); + ht_free(table); + // Perform semantic analysis. // TODO: Check that symbols are defined before usage. // TODO: Remove unnecessary statements. @@ -522,3 +541,37 @@ object_display(Object *obj) { } return; } + +bool +object_equal(Object *a, Object *b) { + if (a == NULL || b == NULL || a->type != b->type) { + return false; + } + switch (a->type) { + case OBJ_TYPE_TRUE: + case OBJ_TYPE_FALSE: { + return true; + } break; + case OBJ_TYPE_FIXNUM: { + return a->fixnum == b->fixnum; + } break; + case OBJ_TYPE_SYMBOL: + case OBJ_TYPE_STRING: { + if (array_size(a->text) != array_size(b->text)) { + return false; + } + for (size_t i = 0; i < array_size(a->text); i++) { + if (a->text[i] != b->text[i]) { + return false; + } + } + } break; + case OBJ_TYPE_LAMBDA: { + // return a->closure == b.closure; + } break; + default: { + return false; + } break; + } + return true; +} -- cgit v1.2.1