diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2023-02-16 17:11:38 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2023-02-16 17:11:38 -0800 |
| commit | 7410d984ae270528ea4f3f16d3473acf807ef92c (patch) | |
| tree | b98ceaab29da9d791392007ad1c8e99d82e7210a /src/parse.c | |
| parent | a2063489b84cbc47bd51aee761b3c5dd35e0195f (diff) | |
preprocessor works now, added some helper methods and a few more frees
Diffstat (limited to 'src/parse.c')
| -rw-r--r-- | src/parse.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/parse.c b/src/parse.c index 27ee417..c7f5e5b 100644 --- a/src/parse.c +++ b/src/parse.c @@ -5,6 +5,19 @@ #include "parse.h" #include "hashtable.h" +sym_t* init_sym(prov_t province, litType_t litType, void* name) { + sym_t* symbol = malloc(sizeof(sym_t)); + symbol->province = province; + symbol->litType = litType; + symbol->name = name; + symbol->argCount = 0; + return symbol; +} +void destroy_sym(sym_t* symbol) { + free(symbol->name); + free(symbol->args); + free(symbol); +} int symtoi(sym_t* symbol) { return *((int*)symbol->name); } @@ -56,25 +69,21 @@ symset_t* parse_symbols(char** str) { symbolName[i] = **str; if (**str == ',' || **str == ';') { (*str)++; - sym_t* symbol = malloc(sizeof(sym_t)); - symbol->province = LITERAL; - symbol->argCount = 0; symbolName[i] = '\0'; + sym_t* symbol; /* TODO: float */ /* string */ if (isalpha(symbolName[0])) { //symbolName = realloc(symbolName, i * sizeof(char)); - symbol->name = symbolName; - symbol->litType = STRING; + symbol = init_sym(LITERAL, STRING, symbolName); } /* int */ else { int v = atoi(symbolName); int* vp = malloc(sizeof(int)); *vp = v; - symbol->name = (void*)vp; free(symbolName); - symbol->litType = INT; + symbol = init_sym(LITERAL, INT, vp); } symset_add_symbol(symbolSet, symbol); break; @@ -82,14 +91,15 @@ symset_t* parse_symbols(char** str) { else if (**str == '(') { (*str)++; symbolName[i] = '\0'; - sym_t* symbol = malloc(sizeof(sym_t)); - symbol->province = KEY_REF; - symbol->argCount = 0; + sym_t* symbol; if (i > 1) { - symbol->name = symbolName; + symbol = init_sym(KEY_REF, NO_TYPE, symbolName); } else { - symbol->name = "root"; + free(symbolName); + char* memName = malloc(5 * sizeof(char)); + strcpy(memName, "root"); + symbol = init_sym(KEY_REF, NO_TYPE, memName); } symset_t* symbols = parse_symbols(str); for (int s = 0; s < symbols->count; s++) { @@ -107,10 +117,9 @@ sym_t* parse_symbol_final(char* str) { char** strp = malloc(sizeof(char**)); *strp = str; symset_t* finalSymset = parse_symbols(strp); - sym_t* root = malloc(sizeof(sym_t)); - root->name = "root"; - root->province = KEY_REF; - root->argCount = 0; + char* memName = malloc(5 * sizeof(char)); + strcpy(memName, "root"); + sym_t* root = init_sym(KEY_REF, NO_TYPE, memName); for (int s = 0; s < finalSymset->count; s++) { symbol_add_arg(root, finalSymset->symbols[s]); } |
