roza/lib/StaticPass.cpp

62 lines
1.3 KiB
C++
Raw Normal View History

2023-08-30 18:06:26 +00:00
#include "StaticPass.hpp"
#include "lib/Node.hpp"
2023-08-30 22:31:19 +00:00
#include "TypeResolver.hpp"
2023-08-30 18:06:26 +00:00
namespace roza
{
/*explicit*/ StaticPass::StaticPass(StatusLog& log)
: m_log { log }
{
}
/*virtual*/ StaticPass::~StaticPass()
{
}
void StaticPass::check(std::shared_ptr<Node> root)
{
2023-08-30 22:31:19 +00:00
TypeResolver resolver {m_log};
2023-08-30 18:06:26 +00:00
switch (root->type())
{
case NODE_INT: break;
2023-08-30 22:31:19 +00:00
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: {
2023-08-30 18:06:26 +00:00
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() + "'");
}
}
}