diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-09 15:40:55 +0100 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-09 15:40:55 +0100 |
commit | b6cf209e65721c9b749124e6c5866b9359fc6583 (patch) | |
tree | 6426e7481f864b3a1d72c0bc21e4c89df6e9463e /comp/lucas-standen-NEA/code | |
parent | 3f23b452f8ab504a3337f88ddc714c3a660d2648 (diff) |
made alot work with vars
Diffstat (limited to 'comp/lucas-standen-NEA/code')
-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 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/global/types.h | 6 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/global/util.c | 11 | ||||
-rwxr-xr-x | comp/lucas-standen-NEA/code/proto/parser/test | bin | 28680 -> 29232 bytes | |||
-rw-r--r-- | comp/lucas-standen-NEA/code/tokenizer/tokenizer.c | 11 |
10 files changed, 55 insertions, 26 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); diff --git a/comp/lucas-standen-NEA/code/global/types.h b/comp/lucas-standen-NEA/code/global/types.h index 67c4a58..885c780 100644 --- a/comp/lucas-standen-NEA/code/global/types.h +++ b/comp/lucas-standen-NEA/code/global/types.h @@ -60,6 +60,12 @@ typedef union literal { Vdef *vdef; } literal; +typedef struct var { + literal *value; + types type; + char *id; +} var; + // built in functions typedef enum builtInFuncs { // general diff --git a/comp/lucas-standen-NEA/code/global/util.c b/comp/lucas-standen-NEA/code/global/util.c index a29bbbc..5f41dbc 100644 --- a/comp/lucas-standen-NEA/code/global/util.c +++ b/comp/lucas-standen-NEA/code/global/util.c @@ -17,8 +17,8 @@ literal *giveType(char *tok); void Die(){ - perror("zpy parser"); - exit(errno); + fprintf(stderr, "error occured, bringing down the program\n"); + exit(1); } void *CheckedMalloc(long size){ @@ -103,7 +103,10 @@ Vdef *isVdef(char *str){ if (strchr(str, ':') != NULL){ Vdef *out = CheckedMalloc(sizeof(Vdef)); char *type; - type = strtok(str, ":"); + + out->id = strtok(str, ":"); + + type = strtok(NULL, ":"); if (strcmp(type, "i64") == 0) out->type = TI64; else if (strcmp(type, "i32") == 0) out->type = TI32; else if (strcmp(type, "u64") == 0) out->type = TU64; @@ -117,7 +120,6 @@ Vdef *isVdef(char *str){ Die(); } - out->id = strtok(NULL, ":"); return out; } return NULL; @@ -143,7 +145,6 @@ literal *giveType(char *tok){ out->vdef = vdef; } else { fprintf(stderr, "data %s could not be typed\n", tok); - errno = 22; Die(); } return out; diff --git a/comp/lucas-standen-NEA/code/proto/parser/test b/comp/lucas-standen-NEA/code/proto/parser/test Binary files differindex bc47f65..62ad779 100755 --- a/comp/lucas-standen-NEA/code/proto/parser/test +++ b/comp/lucas-standen-NEA/code/proto/parser/test diff --git a/comp/lucas-standen-NEA/code/tokenizer/tokenizer.c b/comp/lucas-standen-NEA/code/tokenizer/tokenizer.c index c72270b..afd68fe 100644 --- a/comp/lucas-standen-NEA/code/tokenizer/tokenizer.c +++ b/comp/lucas-standen-NEA/code/tokenizer/tokenizer.c @@ -126,8 +126,11 @@ ast_node *tokenize(char *input){ expressFunction(function, node); - char *tok; - tok = strtok(strstr(exp, " ") + 1, " "); + char *tok, *saveptr, *expptr = exp; + + exp = strstr(exp, " "); + tok = strtok_r(exp, " ", &saveptr); + argCount = 0; depth = 0; do { @@ -143,10 +146,10 @@ ast_node *tokenize(char *input){ if (tok[0] == '(') depth++; if (tok[strlen(tok)-1] == ')') depth--; - tok = strtok(NULL, " "); + tok = strtok_r(NULL, " ", &saveptr); } while (tok != NULL); - free(exp); + free(expptr); return node; } |