From 903ff13b3be1c29e35621afcef116329e2da16c8 Mon Sep 17 00:00:00 2001 From: Vicente Date: Tue, 2 Apr 2024 21:15:25 -0300 Subject: Implemented left recursion descent parser --- tree.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 tree.c (limited to 'tree.c') diff --git a/tree.c b/tree.c new file mode 100644 index 0000000..e5fc435 --- /dev/null +++ b/tree.c @@ -0,0 +1,60 @@ +#include +#include +#include "tree.h" + +int strichar(const char *str, char c){ + for(int i=0; str[i]!='\0';i++){ + if(str[i] == c) return i; + } + return -1; //char not found +} +const char ops[] = {'+','*','!'}; //ordem inversa +const int opsize = sizeof(ops)/sizeof(char); +node * parse(char *str) { //expects a string with no whitespace + + int j,i; + for(i=0; i=0) break; + } + + node *this = (node *)malloc(sizeof(node)); + + if(j<0) { + this->type = LTTR; + this->el = str[0]; + } + + else{ + this->el = ops[i]; + if(i==2) { + this->type = UNOP; + this->child[0] = parse(str+j+1); + } + else { + str[j] = '\0'; + this->type = BIOP; + this->child[0] = parse(str); + this->child[1] = parse(str+j+1); + } + } + return this; +} + +void printTree(node *root, int level) { + if (root == NULL) + return; + + if (level) { + for (int i = 1; i < level; i++) { + printf("│ "); + } + printf("├─ "); + } + printf("%c\n", root->el); + for (int i = 0; i < 2; i++) { + if (root->child[i] != NULL) { + printTree(root->child[i], level + 1); + } + } +} -- cgit v1.2.3