diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/parser.c b/src/parser.c index 45b4412..be3461c 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,10 +1,12 @@ #include "../include/parser.h" #include "../include/bytecode.h" +#include "../include/std/hash_map.h" #include <stdio.h> typedef struct { TslTokenizer tokenizer; TslBytecodeWriter bytecode_writer; + TslHashMap variables; } TslParser; static int tsl_parser_parse_rhs(TslParser *self); @@ -13,6 +15,23 @@ static int tsl_parser_parse_expressions(TslParser *self, TslToken end_token); static void tsl_parser_init(TslParser *self, const char *code, size_t code_size) { tsl_tokenizer_init(&self->tokenizer, code, code_size); tsl_bytecode_writer_init(&self->bytecode_writer); + tsl_hash_map_init(&self->variables); +} + +static void tsl_parser_deinit(TslParser *self) { + tsl_bytecode_writer_deinit(&self->bytecode_writer); + tsl_hash_map_deinit(&self->variables); +} + +static uint64_t hash_string_view(const void *data, size_t size) { + uint64_t result = 0xdec05eba; + const uint8_t *p = data; + while(size) { + result = ((result << 5) + result) + *p; + ++p; + --size; + } + return result; } static int tsl_parser_parse_map(TslParser *self) { @@ -280,6 +299,12 @@ int tsl_parser_parse_expressions(TslParser *self, TslToken end_token) { TslStringView identifier = self->tokenizer.identifier; printf("identifier: %.*s\n", identifier.size, identifier.data); if(tsl_tokenizer_peek(&self->tokenizer) == TSL_TOKEN_EQUAL) { + void *existing_variable = tsl_hash_map_get(&self->variables, &identifier, hash_string_view); + if(!existing_variable) { + fprintf(stderr, "Variable declaration: %.*s\n", identifier.size, identifier.data); + if(!tsl_hash_map_insert(&self->variables, &identifier, "a", 1, hash_string_view)) + return -1; + } tsl_tokenizer_consume_peek(&self->tokenizer); /* consume previous TSL_TOKEN_EQUAL */ if(tsl_parser_parse_rhs(self) != 0) return -1; @@ -298,7 +323,10 @@ int tsl_parser_parse_expressions(TslParser *self, TslToken end_token) { } int tsl_parse(const char *code, size_t code_size) { + int result; TslParser parser; tsl_parser_init(&parser, code, code_size); - return tsl_parser_parse_expressions(&parser, TSL_TOKEN_END_OF_FILE); + result = tsl_parser_parse_expressions(&parser, TSL_TOKEN_END_OF_FILE); + tsl_parser_deinit(&parser); + return result; } |