Files
Michael Fabian 'Xaymar' Dirks c4947bd12a compiler: Move and modernize
compiler is blitzcc, what I previously called compiler is now compiler_lib
2019-01-19 18:28:07 +01:00

92 lines
1.8 KiB
C++

#include "environ.hpp"
#include "decl.hpp"
#include "label.hpp"
#include "type.hpp"
Environ::Environ(const std::string& f, Type* r, int l, Environ* gs) : funcLabel(f), returnType(r), level(l), globals(gs)
{
decls = new DeclSeq();
typeDecls = new DeclSeq();
funcDecls = new DeclSeq();
if (globals)
globals->children.push_back(this);
}
Environ::~Environ()
{
if (globals)
globals->children.remove(this);
while (children.size())
delete children.back();
for (; labels.size(); labels.pop_back())
delete labels.back();
//delete all types
delete decls;
delete funcDecls;
delete typeDecls;
for (int k = 0; k < types.size(); ++k)
delete types[k];
}
Decl* Environ::findDecl(const std::string& s)
{
for (Environ* e = this; e; e = e->globals) {
if (Decl* d = e->decls->findDecl(s)) {
if (d->kind & (DECL_LOCAL | DECL_PARAM)) {
if (e == this)
return d;
} else
return d;
}
}
return 0;
}
Decl* Environ::findFunc(const std::string& s)
{
for (Environ* e = this; e; e = e->globals) {
if (Decl* d = e->funcDecls->findDecl(s))
return d;
}
return 0;
}
Type* Environ::findType(const std::string& s)
{
if (s == "%")
return Type::int_type;
if (s == "#")
return Type::float_type;
if (s == "$")
return Type::string_type;
for (Environ* e = this; e; e = e->globals) {
if (Decl* d = e->typeDecls->findDecl(s))
return d->type->structType();
}
return 0;
}
Label* Environ::findLabel(const std::string& s)
{
for (int k = 0; k < labels.size(); ++k)
if (labels[k]->name == s)
return labels[k];
return 0;
}
Label* Environ::insertLabel(const std::string& s, int def, int src, int sz)
{
Label* l = new Label(s, def, src, sz);
labels.push_back(l);
return l;
}
std::string Environ::setBreak(const std::string& s)
{
std::string t = breakLabel;
breakLabel = s;
return t;
}