diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 83 |
1 files changed, 48 insertions, 35 deletions
diff --git a/src/parser.c b/src/parser.c index 35cafe2..851c860 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,19 +1,25 @@ #include <parser.h> -#define true 1 -#define false 0 -typedef uint8_t bool; - +#include <stdbool.h> #include <heap.h> -#include <clock.h> + +#define MAX_VAR 8 +#define MAX_STACK 8 static const char *interpreter_operators = "=("; -int strcmp(const char *s1, const char *s2) +bool strcmp(const char *a, const char *b) +{ + int i = 0; + for (; a[i] == b[i] && a[i] != '\0'; i++); + return a[i] == b[i]; +} + +bool strncmp(const char *a, const char *b, int count) { int i = 0; - for (; s1[i] == s2[i] && s1[i] != '\0'; i++); - return s1[i] == s2[i]; + for (; a[i] == b[i] && i < count; i++); + return i == count; } uint8_t isalpha(char c) @@ -50,9 +56,9 @@ void interpreter_init(interpreter *interp) { interp->status = READY; interp->vcount = 0; - interp->vars = (variable *)hcalloc(32, sizeof(variable)); - interp->names = (char **)hcalloc(32, sizeof(char *)); - interp->stack = (stack_t *)hcalloc(64, sizeof(stack_t)); + interp->vars = (variable *)hcalloc(MAX_VAR, sizeof(variable)); + interp->names = (char **)hcalloc(MAX_VAR, sizeof(char *)); + interp->stack = (stack_t *)hcalloc(MAX_STACK, sizeof(stack_t)); } void interpreter_define_value(interpreter *interp, const char *name, int32_t value) @@ -91,7 +97,7 @@ bool namencmp(const char *name, const char *s) { uint16_t i; for (i = 0; name[i] == s[i] && s[i] != '\0'; i++); - return (name[i] == '\0'); + return (name[i] == '\0' && !isname(s[i])); } uint16_t spacecount(const char *s) @@ -101,10 +107,10 @@ uint16_t spacecount(const char *s) return i; } -char *copystr(const char *s) +char *copystr(const char *s, char end) { uint16_t len = 0; - while (s[len++] != '\n'); + while (s[len++] != end); char *buf = (char *)hmalloc(len); for (uint16_t i = 0; i < len; i++) buf[i] = s[i]; @@ -119,31 +125,37 @@ char *copysubstr(const char *s, int end) return buf; } +variable *interpreter_getvar(interpreter *interp, const char *line) +{ + for (uint16_t i = 0; i < interp->vcount; i++) { + if (namencmp(interp->names[i], line)) + return &interp->vars[i]; + } + + return 0; +} + int interpreter_doline(interpreter *interp, const char *line) { variable *bits[16]; uint16_t offset = 0, boffset = 0; // check for var/func set or usage + int end; getvar: - for (uint16_t i = 0; i < interp->vcount; i++) { - if (namencmp(interp->names[i], line)) { - bits[boffset++] = &interp->vars[i]; - // get past name - for (uint16_t j = 0; interp->names[i][j] != '\0'; j++, offset++); - break; - } - } + for (end = 0; isname(line[end]); end++); + variable *var = interpreter_getvar(interp, line); - // defining new variable - if (boffset == 0) { - uint16_t end; - for (end = 0; isname(line[end]); end++); + if (var != 0) { + bits[boffset++] = var; + } else { + // defining new variable interpreter_define_value(interp, copysubstr(line, end), 0); goto getvar; // try again } - // skip whitespace + // skip whitespace/name + offset += end; offset += spacecount(line + offset); if (boffset == 0 && line[offset] != '=') @@ -154,12 +166,10 @@ getvar: // print value return -99; } else if (line[offset] == '=') { - return -23; // assignment/expression - //offset++; - //offset += spacecount(line + offset); - //if (boffset > 0) - // bits[boffset]->value = (uint32_t)copystr(line + offset); + offset++; + offset += spacecount(line + offset); + bits[0]->value = (uint32_t)copystr(line + offset, '\0'); } else if (line[offset] == '(') { // function call offset++; @@ -200,9 +210,12 @@ getvar: for (j = offsets[i]; line[j] != ' ' && line[j] != '\t' && line[j] != ',' && line[j] != ')'; j++); j -= offsets[i]; - interp->stack[i] = (char *)hmalloc(j); - for (uint16_t k = 0; k < j; k++) - ((char *)interp->stack[i])[k] = line[offsets[i] + k]; + + variable *var = interpreter_getvar(interp, line + offsets[i]); + if (var != 0) + interp->stack[i] = copystr((char *)var->value, '\0'); + else + interp->stack[i] = copysubstr(line + offsets[i], j); } ((func_t)bits[0]->value)(interp->stack); |