#include "syn_tree.hpp" #include using namespace std; int counter = 0; SynTree::~SynTree() { } void Constant::compile() const { cout << "push " << _v << endl; } void Variable::compile() const { cout << "push " << _s << endl; } string Variable::getName() const { return _s; } InnerTree::InnerTree(SynTree* a) { _nodes.resize(0); _nodes.push_back(a); } InnerTree::InnerTree(SynTree* a, SynTree* b) { _nodes.resize(0); _nodes.push_back(a); _nodes.push_back(b); } InnerTree::InnerTree(SynTree* a, SynTree* b, SynTree* c) { _nodes.resize(0); _nodes.push_back(a); _nodes.push_back(b); _nodes.push_back(c); } InnerTree::InnerTree(vector v) { _nodes = v; } InnerTree::~InnerTree() { for (unsigned i = 0; i < _nodes.size(); i++) delete _nodes[i]; } void Add::compile() const { _nodes[0]->compile(); _nodes[1]->compile(); cout << "add" << endl; } void Sub::compile() const { _nodes[0]->compile(); _nodes[1]->compile(); cout << "sub" << endl; } void Mul::compile() const { _nodes[0]->compile(); _nodes[1]->compile(); cout << "mul" << endl; } void Div::compile() const { _nodes[0]->compile(); _nodes[1]->compile(); cout << "div" << endl; } void Less::compile() const { _nodes[0]->compile(); _nodes[1]->compile(); cout << "lt" << endl; } void Greater::compile() const { _nodes[0]->compile(); _nodes[1]->compile(); cout << "gt" << endl; } void Print::compile() const { _nodes[0]->compile(); cout << "print" << endl; } void Assign::compile() const { _nodes[1]->compile(); cout << "pop " << ((Variable*)_nodes[0])->getName() << endl; } void Seq::compile() const { for(unsigned i = 0; i < _nodes.size(); i++) _nodes[i]->compile(); } void While::compile() const { int tmp = counter; counter+=2; cout << "L" << tmp << ":" << endl; _nodes[0]->compile(); cout << "jz L" << tmp+1 << endl; _nodes[1]->compile(); cout << "jmp L" << tmp << endl; cout << "L" << tmp + 1 << ":" << endl; } void Eps::compile() const { //nista } void IfThenElse::compile() const { int tmp = counter; counter += 2; _nodes[0]->compile(); cout << "jz L" << tmp << endl; _nodes[1]->compile(); cout << "jmp L" << tmp + 1 << endl; cout << "L" << tmp << ":"<< endl; _nodes[2]->compile(); cout << "L" << tmp + 1 << ":" << endl; } void IfThen::compile() const { int tmp = counter; counter++; _nodes[0]->compile(); cout << "jz L" << tmp << endl; _nodes[1]->compile(); cout << "L" << tmp << ":"<< endl; }