c4947bd12a
compiler is blitzcc, what I previously called compiler is now compiler_lib
92 lines
1.8 KiB
C++
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;
|
|
}
|