72 lines
1.7 KiB
C++
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";
|
|
}
|
|
} |