orga-comp/utilities.cpp

72 lines
1.7 KiB
C++

#include "orga-comp.h"
#include <iostream>
void
print_tokens(std::vector<struct token*> 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";
}
}