#include "ast.hpp" #include using namespace std; SynTree::~SynTree() { } void Constant::compile() const { cout << "push " << _i << endl; } void Variable::compile() const { cout << "push " << _s << endl; } InnerTree::~InnerTree() { for (unsigned i = 0; i < _v.size(); i++) delete _v[i]; } void Add::compile() const { _v[0]->compile(); _v[1]->compile(); cout << "add" << endl; } void Sub::compile() const { _v[0]->compile(); _v[1]->compile(); cout << "sub" << endl; } void Mul::compile() const { _v[0]->compile(); _v[1]->compile(); cout << "mul" << endl; } void Div::compile() const { _v[0]->compile(); _v[1]->compile(); cout << "div" << endl; } void Lt::compile() const { _v[0]->compile(); _v[1]->compile(); cout << "lt" << endl; } void Gt::compile() const { _v[0]->compile(); _v[1]->compile(); cout << "gt" << endl; } void Assign::compile() const { _v[1]->compile(); cout << "pop " << ((Variable*)_v[0])->getName() << endl; } void Print::compile() const { _v[0]->compile(); cout << "print" << endl; } void Block::compile() const { for (unsigned i = 0; i < _v.size(); i++) _v[i]->compile(); } void While::compile() const { static int brojac = 0; int l0 = brojac++; int l1 = brojac++; cout << "L" << l0 << ":" << endl; _v[0]->compile(); cout << "jz L" << l1 << endl; _v[1]->compile(); cout << "jmp L" << l0 << endl; cout << "L" << l1 << ":" << endl; } void Empty::compile() const { //NISTA } void IfThenElse::compile() const { static int brojac = 0; int l0 = brojac++; int l1 = brojac++; _v[0]->compile(); cout << "jz LL" << l0 << endl; _v[1]->compile(); cout << "jmp LL" << l1 << endl; cout << "LL" << l0 << ":" << endl; _v[2]->compile(); cout << "LL" << l1 << ":" << endl; } void IfThen::compile() const { static int brojac = 0; int l0 = brojac++; _v[0]->compile(); cout << "jz LLL" << l0 << endl; _v[1]->compile(); cout << "LLL" << l0 << ":" << endl; }