slr

S Lang Runtime
git clone https://codeberg.org/night0721/slr
Log | Files | Refs | README | LICENSE

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 }