diff options
Diffstat (limited to 'comp/lucas-standen-NEA/code/execution')
-rw-r--r-- | comp/lucas-standen-NEA/code/execution/Makefile | 8 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/execution/builtin.c | 16 | ||||
-rwxr-xr-x | comp/lucas-standen-NEA/code/execution/exec | bin | 40360 -> 42080 bytes | |||
-rw-r--r-- | comp/lucas-standen-NEA/code/execution/exec.c | 2 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/execution/vars.c | 23 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/execution/vars.h | 4 |
6 files changed, 36 insertions, 17 deletions
diff --git a/comp/lucas-standen-NEA/code/execution/Makefile b/comp/lucas-standen-NEA/code/execution/Makefile index 00c18b6..a22db25 100644 --- a/comp/lucas-standen-NEA/code/execution/Makefile +++ b/comp/lucas-standen-NEA/code/execution/Makefile @@ -1,8 +1,10 @@ -all: exec builtin +all: exec builtin vars $(info done execution!) -exec: exec.c builtin - cc exec.c builtin.o ../tokenizer/tokenizer.o ../global/util.o -o exec -ggdb +exec: exec.c builtin vars + cc exec.c builtin.o vars.o ../tokenizer/tokenizer.o ../global/util.o -o exec -ggdb builtin: builtin.c cc builtin.c -c -o builtin.o -ggdb +vars: vars.c + cc vars.c -c -o vars.o -ggdb clean: rm -rf *.o exec diff --git a/comp/lucas-standen-NEA/code/execution/builtin.c b/comp/lucas-standen-NEA/code/execution/builtin.c index 12441cd..a2b67fb 100644 --- a/comp/lucas-standen-NEA/code/execution/builtin.c +++ b/comp/lucas-standen-NEA/code/execution/builtin.c @@ -1,6 +1,8 @@ #include <stdlib.h> #include <stdio.h> -#include "../global/types.h" + +#include "vars.h" + #include "../global/util.h" #define MAXARGS 8 @@ -41,10 +43,18 @@ void *doCall(ast_node *node){ for (int i = 0; i < node->literalArgs[0]->arr->len; i++) fputc(node->literalArgs[0]->arr->arr[i].ch->data, stdout); break; + + case LET: + newVar(node->literalArgs[0]->vdef, node->literalArgs[1]); + break; case EXIT: - int returnValue = (int)node->literalArgs[0]->i64->data; - exit(returnValue); + exit((int)node->literalArgs[0]->i64->data); + break; + + default: + fprintf(stderr, "command not implemented"); + exit(1); break; } } diff --git a/comp/lucas-standen-NEA/code/execution/exec b/comp/lucas-standen-NEA/code/execution/exec Binary files differindex 7fc4a06..f30273e 100755 --- a/comp/lucas-standen-NEA/code/execution/exec +++ b/comp/lucas-standen-NEA/code/execution/exec diff --git a/comp/lucas-standen-NEA/code/execution/exec.c b/comp/lucas-standen-NEA/code/execution/exec.c index 8775526..73961ac 100644 --- a/comp/lucas-standen-NEA/code/execution/exec.c +++ b/comp/lucas-standen-NEA/code/execution/exec.c @@ -6,7 +6,7 @@ #include "../tokenizer/tokenizer.h" int main(){ - char *sample = "(write ['h','e','l','l','o','\n'])"; + char *sample = "(let a:i64 5)"; ast_node *root = tokenize(sample); doCall(root); diff --git a/comp/lucas-standen-NEA/code/execution/vars.c b/comp/lucas-standen-NEA/code/execution/vars.c index db67c75..ebf4de5 100644 --- a/comp/lucas-standen-NEA/code/execution/vars.c +++ b/comp/lucas-standen-NEA/code/execution/vars.c @@ -3,20 +3,23 @@ #include "../global/util.h" #include "../tokenizer/tokenizer.h" -char *userVars[MAXVARS]; +var *userVars[MAXVARS]; long varCount = 0; -literal *newVar(char *name, literal *value){ - userVars[varCount] = name; - varCount++; - literal *out = CheckedMalloc(sizeof(literal)); - +void newVar(Vdef *definiton, literal *value){ + var *new = CheckedMalloc(sizeof(var)); + new->type = definiton->type; + new->id = definiton->id; + new->value = value; + userVars[varCount] = new; } -literal *toLiteral(char *str){ - for (int i = 0; i < userVarCount; i++){ - if (strcmp(str, userDefinedVars[i]) == 0){ - +literal *getVarCalled(char *name){ + for (int i = 0; i < varCount; i++){ + if (strcmp(userVars[i]->id, name)){ + return userVars[i]->value; } } + printf("no such variable %s\n", name); + return NULL; } diff --git a/comp/lucas-standen-NEA/code/execution/vars.h b/comp/lucas-standen-NEA/code/execution/vars.h new file mode 100644 index 0000000..2e8ef99 --- /dev/null +++ b/comp/lucas-standen-NEA/code/execution/vars.h @@ -0,0 +1,4 @@ +#include "../global/types.h" + +void newVar(Vdef *definiton, literal *value); +literal *getVarCalled(char *name); |