diff options
Diffstat (limited to 'src/parse.c')
| -rw-r--r-- | src/parse.c | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/src/parse.c b/src/parse.c index b84a3f6..4aafc32 100644 --- a/src/parse.c +++ b/src/parse.c @@ -13,13 +13,20 @@ sym_t* init_sym(prov_t province, litType_t litType, void* name) { symbol->argCount = 0; return symbol; } +sym_t* init_sym_key(char* value) { + char* vp = malloc((strlen(value) + 1) * sizeof(char)); + strcpy(vp, value); + return init_sym(KEY_REF, NO_TYPE, vp); +} sym_t* init_sym_int(int value) { int* vp = malloc(sizeof(int)); *vp = value; return init_sym(LITERAL, INT, vp); } sym_t* init_sym_str(char* value) { - return init_sym(LITERAL, STRING, value); + char* vp = malloc((strlen(value) + 1) * sizeof(char)); + strcpy(vp, value); + return init_sym(LITERAL, STRING, vp); } void destroy_sym(sym_t* symbol) { free(symbol->name); @@ -28,6 +35,20 @@ void destroy_sym(sym_t* symbol) { } free(symbol); } +void destroy_sym_tree(sym_t* origin) { + if (origin->province == KEY_REF) { + /* doesn't follow user-defined refs */ + if (is_internal((char*)origin->name)) { + for (int i = 0; i < origin->argCount; i++) { + destroy_sym_tree(origin->args[i]); + } + destroy_sym(origin); + } + } + else if (origin->province == LITERAL) { + destroy_sym(origin); + } +} int symtoi(sym_t* symbol) { return *((int*)symbol->name); } @@ -37,7 +58,6 @@ float symtof(sym_t* symbol) { char* symtos(sym_t* symbol) { return (char*)symbol->name; } - void symbol_add_arg(sym_t* symbol, sym_t* arg) { symbol->argCount += 1; if (symbol->argCount == 1) { @@ -92,7 +112,6 @@ symset_t* parse_symbols(char** str) { else { int v = atoi(symbolName); symbol = init_sym_int(v); - free(symbolName); } symset_add_symbol(symbolSet, symbol); break; @@ -102,13 +121,10 @@ symset_t* parse_symbols(char** str) { symbolName[i] = '\0'; sym_t* symbol; if (i > 1) { - symbol = init_sym(KEY_REF, NO_TYPE, symbolName); + symbol = init_sym_key(symbolName); } else { - free(symbolName); - char* memName = malloc(5 * sizeof(char)); - strcpy(memName, "root"); - symbol = init_sym(KEY_REF, NO_TYPE, memName); + symbol = init_sym_key("root"); } symset_t* symbols = parse_symbols(str); for (int s = 0; s < symbols->count; s++) { @@ -120,20 +136,31 @@ symset_t* parse_symbols(char** str) { i++; (*str)++; } + free(symbolName); } } sym_t* parse_symbol_final(char* str) { char** strp = malloc(sizeof(char**)); *strp = str; symset_t* finalSymset = parse_symbols(strp); - char* memName = malloc(5 * sizeof(char)); - strcpy(memName, "root"); - sym_t* root = init_sym(KEY_REF, NO_TYPE, memName); + free(strp); + sym_t* root = init_sym_key("root"); for (int s = 0; s < finalSymset->count; s++) { symbol_add_arg(root, finalSymset->symbols[s]); } return root; } +/* TODO: improve this system */ +int is_internal(char* name) { + unsigned int hash = get_hash(name); + if (hash == get_hash("root") || hash == get_hash("store") + || hash == get_hash("eq") || hash == get_hash("if") + || hash == get_hash("not") || hash == get_hash("sum") + || hash == get_hash("print")) { + return 1; + } + return 0; +} void write_symbol_visual(sym_t* symbol, int offset) { for (int o = 0; o < offset; o++) { printf(" "); |
