62 lines
1.3 KiB
C++
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() + "'");
|
|
}
|
|
}
|
|
}
|