summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--comp/lucas-standen-NEA/code/execution/Makefile8
-rw-r--r--comp/lucas-standen-NEA/code/execution/builtin.c16
-rwxr-xr-xcomp/lucas-standen-NEA/code/execution/execbin40360 -> 42080 bytes
-rw-r--r--comp/lucas-standen-NEA/code/execution/exec.c2
-rw-r--r--comp/lucas-standen-NEA/code/execution/vars.c23
-rw-r--r--comp/lucas-standen-NEA/code/execution/vars.h4
-rw-r--r--comp/lucas-standen-NEA/code/global/types.h6
-rw-r--r--comp/lucas-standen-NEA/code/global/util.c11
-rwxr-xr-xcomp/lucas-standen-NEA/code/proto/parser/testbin28680 -> 29232 bytes
-rw-r--r--comp/lucas-standen-NEA/code/tokenizer/tokenizer.c11
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
index 7fc4a06..f30273e 100755
--- 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
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
index bc47f65..62ad779 100755
--- 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
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;
}