school

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

commit cfdd3c90877b59dc674cc9f68c0b7b4bb7c14ba8
parent 7dad37effbeaf44ec12d2ae2fcf1643d4d4351b2
Author: Thing1 <thing1@seacrossedlovers.xyz>
Date:   Tue, 27 Aug 2024 10:36:18 +0100

rewrite

Diffstat:
Mcomp/lucas-standen-NEA/code/execution/exec | 0
Mcomp/lucas-standen-NEA/code/proto/AST/ast | 0
Mcomp/lucas-standen-NEA/code/proto/parser/test | 0
Mcomp/lucas-standen-NEA/code/tokenizer/parser.c | 5+++--
Mcomp/lucas-standen-NEA/code/zpy/zpy | 0
Acomp/lucas-standen-NEA/code2/Makefile | 16++++++++++++++++
Acomp/lucas-standen-NEA/code2/TODO | 2++
Acomp/lucas-standen-NEA/code2/parser.c | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Acomp/lucas-standen-NEA/code2/parser.h | 3+++
Acomp/lucas-standen-NEA/code2/sample.zpy | 1+
Acomp/lucas-standen-NEA/code2/tokenizer.c | 42++++++++++++++++++++++++++++++++++++++++++
Acomp/lucas-standen-NEA/code2/tokenizer.h | 7+++++++
Acomp/lucas-standen-NEA/code2/util.c | 9+++++++++
Acomp/lucas-standen-NEA/code2/util.h | 1+
Acomp/lucas-standen-NEA/code2/zpy.c | 23+++++++++++++++++++++++
15 files changed, 158 insertions(+), 2 deletions(-)

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/proto/AST/ast b/comp/lucas-standen-NEA/code/proto/AST/ast Binary files differ. 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/parser.c b/comp/lucas-standen-NEA/code/tokenizer/parser.c @@ -57,7 +57,7 @@ FILE *preProcess(char *contents){ } char **getExpressions(char *file){ // this doesn't work because str gets overwritten which changes the data stored at it's pointer, memcpy should be used - char **code = CheckedMalloc((strlen(file)/2)*sizeof(char *)); + char **code = CheckedMalloc(strlen(file)/4); int counter = 0; int depth = 0; char *str = CheckedMalloc(strlen(file)+1); @@ -73,7 +73,8 @@ char **getExpressions(char *file){ // this doesn't work because str gets overwri if (depth == 0) { str[pos] = '\0'; printf("%s\n", str); - code[counter] = str; + code[counter] = malloc(strlen(str)+1); + memcpy(code[counter], str, strlen((str)+1)); counter++; pos = 0; } diff --git a/comp/lucas-standen-NEA/code/zpy/zpy b/comp/lucas-standen-NEA/code/zpy/zpy Binary files differ. diff --git a/comp/lucas-standen-NEA/code2/Makefile b/comp/lucas-standen-NEA/code2/Makefile @@ -0,0 +1,16 @@ +CFLAGS= -O0 -ggdb + +all: _zpy _parser _tokenizer _util + cc zpy.o parser.o tokenizer.o util.o -o zpy ${CFLAGS} + +_zpy: zpy.c + cc zpy.c -c -o zpy.o ${CFLAGS} +_parser: parser.c + cc parser.c -c -o parser.o ${CFLAGS} +_tokenizer: tokenizer.c + cc tokenizer.c -c -o tokenizer.o ${CFLAGS} +_util: util.c + cc util.c -c -o util.o ${CFLAGS} + +clean: + rm -rf zpy *.o diff --git a/comp/lucas-standen-NEA/code2/TODO b/comp/lucas-standen-NEA/code2/TODO @@ -0,0 +1,2 @@ +make the tokenizer work, it needs to call recursively whenever it see's a '(' execept the first +expression, perhaps cut them off before the call diff --git a/comp/lucas-standen-NEA/code2/parser.c b/comp/lucas-standen-NEA/code2/parser.c @@ -0,0 +1,51 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "util.h" + +int countChars(char *s, char c){ + int count = 0; + for (int i = 0; i < strlen(s); i++){ + if (s[i] == c) count++; + } + return count; +} + +char **parse(FILE *f){ + fseek(f, 0, SEEK_END); + int len = ftell(f); + rewind(f); + + char *contents = malloc(len); + + if (fread(contents, 1, len, f) == 0){ + die("failed to read file, is it formated properly"); + } + + char **tokens = malloc(countChars(contents, '\n')); + + int tokCount = 0; + int charCount = 0; + char *line = malloc(strlen(contents)); + for (int i = 0; i < len; i++){ + line[charCount] = contents[i]; + charCount++; + + if (contents[i] == '\n'){ + charCount--; + line[charCount] = '\0'; + tokens[tokCount] = malloc(strlen(line)+1); + + memcpy(tokens[tokCount], line, strlen(line)+1); + charCount = 0; + tokCount++; + } + } + + free(line); + free(contents); + + return tokens; +} diff --git a/comp/lucas-standen-NEA/code2/parser.h b/comp/lucas-standen-NEA/code2/parser.h @@ -0,0 +1,3 @@ +#include <stdio.h> + +char **parse(FILE *f); diff --git a/comp/lucas-standen-NEA/code2/sample.zpy b/comp/lucas-standen-NEA/code2/sample.zpy @@ -0,0 +1 @@ +(let a:i64 (+ 2 3)) diff --git a/comp/lucas-standen-NEA/code2/tokenizer.c b/comp/lucas-standen-NEA/code2/tokenizer.c @@ -0,0 +1,42 @@ +#include <stdlib.h> +#include <stdio.h> +#include<string.h> + +#include "util.h" + +typedef struct astNode { + char *funcName; + char *args[8]; + struct astNode *children[8]; +} astNode; + +astNode *tokenize(char *line){ + astNode *head = malloc(sizeof(astNode)); + + int depth = 0; + int charCount = 0; + int argCount = 0; + + + for (int i = 0; i < strlen(line); i++){ + switch (line[i]){ + case ' ': + argCount++; + charCount = 0; + break; + case '(': + 1 + default: + if (argCount >= 1){ + head->args[argCount][charCount] = line[i]; + charCount++; + } + else { + head->funcName[charCount] = line[i]; + charCount++; + } + } + } + + return NULL; +} diff --git a/comp/lucas-standen-NEA/code2/tokenizer.h b/comp/lucas-standen-NEA/code2/tokenizer.h @@ -0,0 +1,7 @@ +typedef struct astNode { + char *funcName; + char *args[8]; + struct astNode *children[8]; +} astNode; + +astNode *tokenize(char *line); diff --git a/comp/lucas-standen-NEA/code2/util.c b/comp/lucas-standen-NEA/code2/util.c @@ -0,0 +1,9 @@ +#include <stdlib.h> +#include <stdio.h> + +void die(char *msg){ + fprintf(stderr, "zpy: %s\n", msg); + exit(1); + +} + diff --git a/comp/lucas-standen-NEA/code2/util.h b/comp/lucas-standen-NEA/code2/util.h @@ -0,0 +1 @@ +void die(char *msg); diff --git a/comp/lucas-standen-NEA/code2/zpy.c b/comp/lucas-standen-NEA/code2/zpy.c @@ -0,0 +1,23 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "util.h" +#include "parser.h" +#include "tokenizer.h" + +int main(int argc, char **argv){ + if (argc < 2) + die("no input files!"); + + FILE *f = fopen(argv[1], "r"); + if (f == NULL) + die("no such file or directory"); + + char **stringTokens = parse(f); + + if (stringTokens == NULL) + die("couldn't parse file, is it formated properly?"); + + tokenize(stringTokens[0]); + +}