From cfdd3c90877b59dc674cc9f68c0b7b4bb7c14ba8 Mon Sep 17 00:00:00 2001 From: Thing1 Date: Tue, 27 Aug 2024 10:36:18 +0100 Subject: rewrite --- comp/lucas-standen-NEA/code2/Makefile | 16 ++++++++++ comp/lucas-standen-NEA/code2/TODO | 2 ++ comp/lucas-standen-NEA/code2/parser.c | 51 ++++++++++++++++++++++++++++++++ comp/lucas-standen-NEA/code2/parser.h | 3 ++ comp/lucas-standen-NEA/code2/sample.zpy | 1 + comp/lucas-standen-NEA/code2/tokenizer.c | 42 ++++++++++++++++++++++++++ comp/lucas-standen-NEA/code2/tokenizer.h | 7 +++++ comp/lucas-standen-NEA/code2/util.c | 9 ++++++ comp/lucas-standen-NEA/code2/util.h | 1 + comp/lucas-standen-NEA/code2/zpy.c | 23 ++++++++++++++ 10 files changed, 155 insertions(+) create mode 100644 comp/lucas-standen-NEA/code2/Makefile create mode 100644 comp/lucas-standen-NEA/code2/TODO create mode 100644 comp/lucas-standen-NEA/code2/parser.c create mode 100644 comp/lucas-standen-NEA/code2/parser.h create mode 100644 comp/lucas-standen-NEA/code2/sample.zpy create mode 100644 comp/lucas-standen-NEA/code2/tokenizer.c create mode 100644 comp/lucas-standen-NEA/code2/tokenizer.h create mode 100644 comp/lucas-standen-NEA/code2/util.c create mode 100644 comp/lucas-standen-NEA/code2/util.h create mode 100644 comp/lucas-standen-NEA/code2/zpy.c (limited to 'comp/lucas-standen-NEA/code2') diff --git a/comp/lucas-standen-NEA/code2/Makefile b/comp/lucas-standen-NEA/code2/Makefile new file mode 100644 index 0000000..2b37de2 --- /dev/null +++ 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 new file mode 100644 index 0000000..34deccd --- /dev/null +++ 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 new file mode 100644 index 0000000..ebf8e47 --- /dev/null +++ b/comp/lucas-standen-NEA/code2/parser.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +#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 new file mode 100644 index 0000000..94b5859 --- /dev/null +++ b/comp/lucas-standen-NEA/code2/parser.h @@ -0,0 +1,3 @@ +#include + +char **parse(FILE *f); diff --git a/comp/lucas-standen-NEA/code2/sample.zpy b/comp/lucas-standen-NEA/code2/sample.zpy new file mode 100644 index 0000000..7ffc605 --- /dev/null +++ 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 new file mode 100644 index 0000000..3b7e394 --- /dev/null +++ b/comp/lucas-standen-NEA/code2/tokenizer.c @@ -0,0 +1,42 @@ +#include +#include +#include + +#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 new file mode 100644 index 0000000..eebfbc5 --- /dev/null +++ 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 new file mode 100644 index 0000000..5cda33e --- /dev/null +++ b/comp/lucas-standen-NEA/code2/util.c @@ -0,0 +1,9 @@ +#include +#include + +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 new file mode 100644 index 0000000..d244c93 --- /dev/null +++ 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 new file mode 100644 index 0000000..3ec448a --- /dev/null +++ b/comp/lucas-standen-NEA/code2/zpy.c @@ -0,0 +1,23 @@ +#include +#include + +#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]); + +} -- cgit v1.2.3