parser.c (2387B)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <ctype.h> 5 6 #include "lexer.h" 7 8 typedef enum { 9 INT_LIT, 10 STATEMENT, 11 EXTRA, 12 BEGINNING, 13 } NodeTypes; 14 15 typedef struct Node { 16 char *value; 17 NodeTypes type; 18 struct Node *right; 19 struct Node *left; 20 } Node; 21 22 void print_tree(Node *node){ 23 if(node == NULL){ 24 return; 25 } 26 for(size_t i = 0; node->value[i] != '\0'; i++){ 27 printf("%c", node->value[i]); 28 } 29 printf("\n"); 30 print_tree(node->left); 31 print_tree(node->right); 32 } 33 34 Node *init_node(Node *node, char *value, NodeTypes type){ 35 node = malloc(sizeof(Node)); 36 node->value = malloc(sizeof(char) * 2); 37 node->type = (int)type; 38 node->value = value; 39 node->left = NULL; 40 node->right = NULL; 41 return node; 42 } 43 44 Token *parser(Token *tokens){ 45 Token *current_token = &tokens[0]; 46 Node *root = malloc(sizeof(Node)); 47 Node *left = malloc(sizeof(Node)); 48 Node *right = malloc(sizeof(Node)); 49 root = init_node(root, "PROGRAM", BEGINNING); 50 51 print_tree(root); 52 53 Node *current = root; 54 55 while(current_token->type != END_OF_TOKENS){ 56 if(current == NULL){ 57 break; 58 } 59 if(current == root){ 60 //; 61 } 62 63 if(current_token->type == KEYWORD && strcmp(current_token->value, "exit")){ 64 Node *exit_node = malloc(sizeof(Node)); 65 exit_node = init_node(exit_node, current_token->value, STATEMENT); 66 root->right = exit_node; 67 current = exit_node; 68 current_token++; 69 if(current_token->type != SEPARATOR){ 70 printf("ERROR\n"); 71 exit(1); 72 } 73 Node *open_paren_node = malloc(sizeof(Node)); 74 open_paren_node = init_node(open_paren_node, current_token->value, EXTRA); 75 current->left = open_paren_node; 76 77 current_token++; 78 79 Node *expr_node = malloc(sizeof(Node)); 80 expr_node = init_node(expr_node, current_token->value, INT_LIT); 81 current->left->left = expr_node; 82 83 current_token++; 84 85 Node *close_paren_node = malloc(sizeof(Node)); 86 close_paren_node = init_node(close_paren_node, current_token->value, EXTRA); 87 current->left->right = close_paren_node; 88 89 current_token++; 90 91 Node *semi_node = malloc(sizeof(Node)); 92 semi_node = init_node(semi_node, current_token->value, EXTRA); 93 current->right = semi_node; 94 95 printf("EXIT\n"); 96 break; 97 } 98 current_token++; 99 } 100 print_tree(root); 101 return current_token; 102 }