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/astg.c | |
parent | 3dad2f4c5ce7fd44015cbd921318b3512c36326e (diff) |
i forgot to commit last time i think
Diffstat (limited to 'comp/lucas-standen-NEA/code/proto/AST/astg.c')
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/AST/astg.c | 52 |
1 files changed, 52 insertions, 0 deletions
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; +} + |