From a3af974ab4e079f9000c4c34cd5ff468986ca609 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Tue, 28 Feb 2023 22:16:22 -0800 Subject: changed syntax to be a little more normal --- src/parse.c | 113 +++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 67 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/parse.c b/src/parse.c index d1b0f2e..3811eae 100644 --- a/src/parse.c +++ b/src/parse.c @@ -82,7 +82,7 @@ symset_t* parse_symbols(char** str) { symbolSet->count = 0; while (1) { /* clear whitespace */ - while (!isalnum(**str) && **str != '-' && **str != '(' && **str != ')' && **str != '\0') { + while (!isalnum(**str) && **str != '"' && **str != '-' && **str != '(' && **str != ')' && **str != '\0') { (*str)++; } if (**str == ')') { @@ -94,64 +94,85 @@ symset_t* parse_symbols(char** str) { } char* symbolName = calloc(30, sizeof(char)); char isFloat = 0; + char isString = 0; int i = 0; while (1) { symbolName[i] = **str; - if (**str == '.') { - isFloat = 1; + if (**str == '"') { + /* start quote */ + if (!isString) { + isString = 1; + } + /* end quote */ + else { + (*str)++; + symbolName[i] = '\0'; + /* offset by one to remove start quote */ + sym_t* symbol = init_sym_str(symbolName + 1); + symset_add_symbol(symbolSet, symbol); + break; + } } - else if (**str == ',' || **str == ';') { - (*str)++; - symbolName[i] = '\0'; - sym_t* symbol; - /* string */ - if (isalpha(symbolName[0])) { - symbol = init_sym_str(symbolName); + else if (!isString) { + if (**str == '.') { + isFloat = 1; } - /* int */ - else if (!isFloat) { - int v; - if (symbolName[0] == '-') { - v = atoi(symbolName + 1) * -1; + else if (!isalnum(**str) && **str != '-' && **str != '(') { + if (**str == ')') { + (*str)--; + } + (*str)++; + symbolName[i] = '\0'; + sym_t* symbol; + if (isalpha(symbolName[0])) { + /* reference */ + symbol = init_sym_key(symbolName); + } + /* int */ + else if (!isFloat) { + int v; + if (symbolName[0] == '-') { + v = atoi(symbolName + 1) * -1; + } + else { + v = atoi(symbolName); + } + symbol = init_sym_int(v); } else { - v = atoi(symbolName); + float v; + if (symbolName[0] == '-') { + v = atof(symbolName + 1) * -1; + } + else { + v = atof(symbolName); + } + symbol = init_sym_float(v); } - symbol = init_sym_int(v); + symset_add_symbol(symbolSet, symbol); + break; } - else { - float v; - if (symbolName[0] == '-') { - v = atof(symbolName + 1) * -1; + else if (**str == '(') { + (*str)++; + symbolName[i] = '\0'; + sym_t* symbol; + if (i > 1) { + symbol = init_sym_key(symbolName); } else { - v = atof(symbolName); + symbol = init_sym_key("root"); } - symbol = init_sym_float(v); - } - symset_add_symbol(symbolSet, symbol); - break; - } - else if (**str == '(') { - (*str)++; - symbolName[i] = '\0'; - sym_t* symbol; - if (i > 1) { - symbol = init_sym_key(symbolName); - } - else { - symbol = init_sym_key("root"); - } - symset_t* symbols = parse_symbols(str); - for (int s = 0; s < symbols->count; s++) { - symbol_add_arg(symbol, symbols->symbols[s]); - } - if (symbols->count > 0) { - free(symbols->symbols); + symset_t* symbols = parse_symbols(str); + for (int s = 0; s < symbols->count; s++) { + symbol_add_arg(symbol, symbols->symbols[s]); + } + if (symbols->count > 0) { + free(symbols->symbols); + } + free(symbols); + symset_add_symbol(symbolSet, symbol); + break; } - free(symbols); - symset_add_symbol(symbolSet, symbol); - break; } i++; (*str)++; -- cgit v1.3.1