aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c30
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;
}