diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-08 11:36:32 +0100 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-08 11:36:32 +0100 |
commit | 4db750bbf03c9d7c18291fc63b7cf23cf966d6c8 (patch) | |
tree | 5abe611dc75cf50160ba29506076f3b5368e9e26 /comp/lucas-standen-NEA/code/proto/AST | |
parent | 3dad2f4c5ce7fd44015cbd921318b3512c36326e (diff) |
i forgot to commit last time i think
Diffstat (limited to 'comp/lucas-standen-NEA/code/proto/AST')
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/AST/Makefile | 4 | ||||
-rwxr-xr-x | comp/lucas-standen-NEA/code/proto/AST/ast | bin | 0 -> 24200 bytes | |||
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/AST/ast.c | 146 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/AST/astg.c | 52 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/AST/astg.h | 19 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/AST/left | 0 | ||||
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/AST/right | 0 |
7 files changed, 221 insertions, 0 deletions
diff --git a/comp/lucas-standen-NEA/code/proto/AST/Makefile b/comp/lucas-standen-NEA/code/proto/AST/Makefile new file mode 100644 index 0000000..6074b00 --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/AST/Makefile @@ -0,0 +1,4 @@ +all: astg ast.c + cc -ggdb ast.c astg.o -o ast +astg: astg.c + cc -ggdb astg.c -c -o astg.o diff --git a/comp/lucas-standen-NEA/code/proto/AST/ast b/comp/lucas-standen-NEA/code/proto/AST/ast Binary files differnew file mode 100755 index 0000000..69ccc93 --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/AST/ast diff --git a/comp/lucas-standen-NEA/code/proto/AST/ast.c b/comp/lucas-standen-NEA/code/proto/AST/ast.c new file mode 100644 index 0000000..d76107b --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/AST/ast.c @@ -0,0 +1,146 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "astg.h" + +void getBrackets(char *in, int bpos, char *out){ + // gets the content of the brackets that open at bpos + if (in[0] != '(' && in[0] != '[') + out = NULL; + + char *input = malloc(strlen(in) + 1); // cpy in for mem safety + char *Pinput = input; + memcpy(input, in, strlen(in) + 1); + + int i = 0; + while (i != bpos){ + input++; + i++; + } + i = 0; + int depth = 0; + while (input[0] != '\0'){ // loop through input + out[i] = input[0]; + if (input[0] == '(' || input[0] == '[') + depth++; + if (input[0] == ')' || input[0] == ']') + depth--; + if (depth == 0){ + i++; + break; + } + + input++; + i++; + } + + out[i] = '\0'; + free(Pinput); +} + +int getContents(char *brackets){ // get all the content in brackets + int i = 0; + char *num = malloc(strlen(brackets)); + while (brackets[0] != '\0'){ + if (brackets[0] != '[' && brackets[0] != ']'){ + num[i] = brackets[0]; + i++; + } + brackets++; + } + num[i] = '\0'; + int out = atoi(num); + free(num); + return out; +} + +ast_node *genAst(char *expression){ + ast_node *out = malloc(sizeof(ast_node)); + + /* take the expression + * get the first operation from it + * get the first number from after the expression + * if that number is another expression{ + * grab everything inside its braket and then call this function on it + * } + * get the second number from the expression + * if that number is another expression{ + * grab everything inside its braket and then call this function on it + * } + */ + + int i = 0, j = 0; + int currentTokenVal = -1; + + char *currentToken = malloc(strlen(expression)+1); + while (expression[i] != '\0'){ + if (expression[i] == '(' || expression[i] == '['){ + getBrackets(expression, i, currentToken); + currentTokenVal++; + + int depth = 0; + + if (i != 0){ + while (expression[i] != '\0'){ + if (expression[i] == '(' || expression[i] == '[') + depth++; + if (expression[i] == ')' || expression[i] == ']') + depth--; + if (depth == 0){ + break; + } + i++; + } + } + + if (currentTokenVal == 0){ + switch (currentToken[1]) { + case '+': + out->operation= ADD; + break; + case '-': + out->operation = SUB; + break; + case '*': + out->operation = MUL; + break; + case '/': + out->operation = DIV; + break; + } + } + + if (currentTokenVal == 1){ + if (currentToken[0] == '(') + out->left = genAst(currentToken); + else { + out->realLeft = getContents(currentToken); + out->left = NULL; + } + } else if (currentTokenVal == 2){ + if (currentToken[0] == '(') + out->right= genAst(currentToken); + else { + out->realRight = getContents(currentToken); + out->right = NULL; + } + } + } + i++; + } + free(currentToken); + + return out; +} + +int main(int argc, char **argv){ + if (argc < 2) // die if no argument given + exit(1); + + ast_node *head = genAst(argv[1]); + + printf("%d\n", exec(head)); + + freeAst(head); +} diff --git a/comp/lucas-standen-NEA/code/proto/AST/astg.c b/comp/lucas-standen-NEA/code/proto/AST/astg.c new file mode 100644 index 0000000..e96b771 --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/AST/astg.c @@ -0,0 +1,52 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +typedef struct ast_node ast_node; + +typedef enum op { + ADD = 0, + SUB = 1, + MUL = 2, + DIV = 3, +} op; + +typedef struct ast_node { + op operation; + int realLeft; + int realRight; + ast_node *right; + ast_node *left; +} ast_node; + +void freeAst(ast_node *head){ + if (head->left != NULL) + freeAst(head->left); + if (head->right != NULL) + freeAst(head->left); + free(head); +} + +int exec(ast_node *exp){ + if (exp->left != NULL){ + exp->realLeft = exec(exp->left); + freeAst(exp->left); + exp->left = NULL; + } + if (exp->right != NULL){ + exp->realRight = exec(exp->right); + freeAst(exp->right); + exp->right = NULL; + } + + if (exp->operation == ADD) + return exp->realLeft+ exp->realRight; + if (exp->operation == SUB) + return exp->realLeft - exp->realRight; + if (exp->operation == MUL) + return exp->realLeft * exp->realRight; + if (exp->operation == DIV) + return exp->realLeft/ exp->realRight; + return 0; +} + diff --git a/comp/lucas-standen-NEA/code/proto/AST/astg.h b/comp/lucas-standen-NEA/code/proto/AST/astg.h new file mode 100644 index 0000000..16250b2 --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/AST/astg.h @@ -0,0 +1,19 @@ +typedef struct ast_node ast_node; + +typedef enum op { + ADD = 0, + SUB = 1, + MUL = 2, + DIV = 3, +} op; + +typedef struct ast_node { + op operation; + int realLeft; + int realRight; + ast_node *right; + ast_node *left; +} ast_node; + +int exec(ast_node *exp); +void freeAst(ast_node *head); diff --git a/comp/lucas-standen-NEA/code/proto/AST/left b/comp/lucas-standen-NEA/code/proto/AST/left new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/AST/left diff --git a/comp/lucas-standen-NEA/code/proto/AST/right b/comp/lucas-standen-NEA/code/proto/AST/right new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/AST/right |