#include "orga-comp.h" #include void print_tokens(std::vector tokens){ for(struct token *tok : tokens) { std::cout << str_token(*tok) << " "; } std::cout << '\n'; } bool leaf(struct token *tok){ if(tok->lvalue != nullptr) return false; if(tok->rvalue != nullptr) return false; return true; } void free_tree(struct token *head){ if(head == nullptr) return; if (leaf(head)) { delete(head); } else { free_tree(head->lvalue); free_tree(head->rvalue); delete(head); } } std::string str_token(struct token tok){ switch (tok.tok_type) { case token::TOK_ID: return "ID(" + tok.value + ")"; case token::TOK_NUM: return "NUM(" + tok.value + ")"; case token::TOK_OP: return "OP(" + tok.value + ")"; case token::TOK_ASSIGN: return "ASSIGN "; case token::TOK_SEMI: return "SEMI "; case token::STM_ASSIGN: return "STM_ASSIGN( " + tok.value + ", " + str_token(*tok.rvalue) + ")"; case token::STM_CJUMP: return "STM_CJUMP( " + str_token(*tok.lvalue) + ", " + str_token(*tok.rvalue) + ")"; case token::STM_COMPOUND: return "STM_COMPOUND< " + str_token(*tok.lvalue) + ", " + str_token(*tok.rvalue) + ">"; case token::EXP_NUMBER: return "EXP_NUMBER(" + tok.value + ")"; case token::EXP_OPERATION: return "EXP_OPERATION( " + str_token(*tok.lvalue) + " " + tok.value + " " + str_token(*tok.rvalue) +")"; case token::EXP_COMPARE: return "EXP_COMPARE( " + str_token(*tok.lvalue) + " " + tok.value + " " + str_token(*tok.rvalue) +")"; case token::EXP_ID: return "EXP_ID "; case token::TOK_END: return "END "; case token::TOK_IF: return "IF "; case token::TOK_DO: return "DO "; case token::TOK_EQ: return "EQUAL "; default: return "SOMETHING"; } }