school

thing1's amazing school repo
Log | Files | Refs | Submodules | README

commit b6cf209e65721c9b749124e6c5866b9359fc6583
parent 3f23b452f8ab504a3337f88ddc714c3a660d2648
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Tue,  9 Jul 2024 15:40:55 +0100

made alot work with vars

Diffstat:
Mcomp/lucas-standen-NEA/code/execution/Makefile | 8+++++---
Mcomp/lucas-standen-NEA/code/execution/builtin.c | 16+++++++++++++---
Mcomp/lucas-standen-NEA/code/execution/exec | 0
Mcomp/lucas-standen-NEA/code/execution/exec.c | 2+-
Mcomp/lucas-standen-NEA/code/execution/vars.c | 23+++++++++++++----------
Acomp/lucas-standen-NEA/code/execution/vars.h | 4++++
Mcomp/lucas-standen-NEA/code/global/types.h | 6++++++
Mcomp/lucas-standen-NEA/code/global/util.c | 11++++++-----
Mcomp/lucas-standen-NEA/code/proto/parser/test | 0
Mcomp/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 @@ -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 @@ -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 differ. diff --git 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 @@ -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 @@ -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 @@ -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 @@ -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 differ. diff --git 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; }