summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parse.c113
1 files changed, 67 insertions, 46 deletions
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)++;