summaryrefslogtreecommitdiff
path: root/comp/lucas-standen-NEA/code/proto/ast
diff options
context:
space:
mode:
Diffstat (limited to 'comp/lucas-standen-NEA/code/proto/ast')
-rw-r--r--comp/lucas-standen-NEA/code/proto/ast/Makefile4
-rwxr-xr-xcomp/lucas-standen-NEA/code/proto/ast/astbin0 -> 20792 bytes
-rw-r--r--comp/lucas-standen-NEA/code/proto/ast/ast.c147
-rw-r--r--comp/lucas-standen-NEA/code/proto/ast/astg.c45
-rw-r--r--comp/lucas-standen-NEA/code/proto/ast/astg.h19
5 files changed, 215 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..e11e20f
--- /dev/null
+++ b/comp/lucas-standen-NEA/code/proto/ast/Makefile
@@ -0,0 +1,4 @@
+all: astg ast.c
+ cc ast.c astg.o -o ast
+astg: astg.c
+ cc 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
new file mode 100755
index 0000000..b4b4f9f
--- /dev/null
+++ b/comp/lucas-standen-NEA/code/proto/ast/ast
Binary files differ
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..80d198d
--- /dev/null
+++ b/comp/lucas-standen-NEA/code/proto/ast/ast.c
@@ -0,0 +1,147 @@
+#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);
+ 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'){
+ 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){
+ 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
+ * }
+ * execute the output
+ */
+
+ 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)
+ 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..fc6fc8f
--- /dev/null
+++ b/comp/lucas-standen-NEA/code/proto/ast/astg.c
@@ -0,0 +1,45 @@
+#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;
+
+int exec(ast_node *exp){
+ if (exp->left != NULL)
+ exp->realLeft = exec(exp->left);
+ if (exp->right != NULL)
+ exp->realRight = exec(exp->right);
+
+ 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;
+}
+
+void freeAst(ast_node *head){
+ if (head->left != NULL)
+ freeAst(head->left);
+ if (head->right != NULL)
+ freeAst(head->left);
+ free(head);
+}
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);