roza/lib/StaticPass.cpp

62 lines
1.3 KiB
C++

#include "StaticPass.hpp"
#include "lib/Node.hpp"
#include "TypeResolver.hpp"
namespace roza
{
/*explicit*/ StaticPass::StaticPass(StatusLog& log)
: m_log { log }
{
}
/*virtual*/ StaticPass::~StaticPass()
{
}
void StaticPass::check(std::shared_ptr<Node> root)
{
TypeResolver resolver {m_log};
switch (root->type())
{
case NODE_INT: break;
case NODE_ADD:
case NODE_SUB:
case NODE_MUL:
case NODE_DIV:
case NODE_MOD:
case NODE_POW: {
auto lhs = resolver.find(root->child(0));
auto rhs = resolver.find(root->child(1));
if (!lhs->equals(*rhs))
{
m_log.fatal(root->loc(),
std::string()
+ "type mismatch, expected '"
+ lhs->string()
+ "', got '"
+ rhs->string()
+ "'");
}
} break;
case NODE_UADD:
case NODE_USUB: {
} break;
case NODE_PROG: {
for (size_t i=0; i<root->size(); i++)
{
check(root->child(i));
}
} break;
default:
m_log.fatal(root->loc(), "cannot check node '" + root->string() + "'");
}
}
}