diff options
Diffstat (limited to 'comp/lucas-standen-NEA/code/proto/astg.c')
-rw-r--r-- | comp/lucas-standen-NEA/code/proto/astg.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/comp/lucas-standen-NEA/code/proto/astg.c b/comp/lucas-standen-NEA/code/proto/astg.c new file mode 100644 index 0000000..e96b771 --- /dev/null +++ b/comp/lucas-standen-NEA/code/proto/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; +} + |