Skip to content
Snippets Groups Projects
Commit f5fa77f1 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Change language operator registration strategy

Now modules can/must register the operators they provide
parent b5d624f9
No related branches found
No related tags found
1 merge request!81Feature/discrete function algebra
Showing
with 137 additions and 75 deletions
#include <language/ast/ASTModulesImporter.hpp>
#include <language/PEGGrammar.hpp>
#include <language/utils/OperatorRepository.hpp>
void
ASTModulesImporter::_importModule(ASTNode& import_node)
......@@ -20,6 +21,7 @@ ASTModulesImporter::_importModule(ASTNode& import_node)
std::cout << " * importing '" << rang::fgB::green << module_name << rang::style::reset << "' module\n";
m_module_repository.populateSymbolTable(module_name_node, m_symbol_table);
m_module_repository.registerOperators(module_name);
}
void
......@@ -37,6 +39,7 @@ ASTModulesImporter::_importAllModules(ASTNode& node)
ASTModulesImporter::ASTModulesImporter(ASTNode& root_node) : m_symbol_table{*root_node.m_symbol_table}
{
Assert(root_node.is_root());
OperatorRepository::instance().reset();
m_module_repository.populateMandatorySymbolTable(root_node, m_symbol_table);
this->_importAllModules(root_node);
......
#include <language/modules/CoreModule.hpp>
#include <language/utils/AffectationProcessorBuilder.hpp>
#include <language/utils/AffectationRegisterForB.hpp>
#include <language/utils/AffectationRegisterForN.hpp>
#include <language/utils/AffectationRegisterForR.hpp>
#include <language/utils/AffectationRegisterForRn.hpp>
#include <language/utils/AffectationRegisterForRnxn.hpp>
#include <language/utils/AffectationRegisterForString.hpp>
#include <language/utils/AffectationRegisterForZ.hpp>
#include <language/utils/BinaryOperatorRegisterForB.hpp>
#include <language/utils/BinaryOperatorRegisterForN.hpp>
#include <language/utils/BinaryOperatorRegisterForR.hpp>
#include <language/utils/BinaryOperatorRegisterForRn.hpp>
#include <language/utils/BinaryOperatorRegisterForRnxn.hpp>
#include <language/utils/BinaryOperatorRegisterForString.hpp>
#include <language/utils/BinaryOperatorRegisterForZ.hpp>
#include <language/utils/IncDecOperatorRegisterForN.hpp>
#include <language/utils/IncDecOperatorRegisterForR.hpp>
#include <language/utils/IncDecOperatorRegisterForZ.hpp>
#include <language/utils/UnaryOperatorRegisterForB.hpp>
#include <language/utils/UnaryOperatorRegisterForN.hpp>
#include <language/utils/UnaryOperatorRegisterForR.hpp>
#include <language/utils/UnaryOperatorRegisterForRn.hpp>
#include <language/utils/UnaryOperatorRegisterForRnxn.hpp>
#include <language/utils/UnaryOperatorRegisterForZ.hpp>
#include <language/modules/CoreModule.hpp>
#include <language/modules/ModuleRepository.hpp>
#include <language/utils/ASTExecutionInfo.hpp>
......@@ -42,3 +70,46 @@ CoreModule::CoreModule() : BuiltinModule(true)
));
}
void
CoreModule::registerOperators() const
{
AffectationRegisterForB{};
AffectationRegisterForN{};
AffectationRegisterForZ{};
AffectationRegisterForR{};
AffectationRegisterForRn<1>{};
AffectationRegisterForRn<2>{};
AffectationRegisterForRn<3>{};
AffectationRegisterForRnxn<1>{};
AffectationRegisterForRnxn<2>{};
AffectationRegisterForRnxn<3>{};
AffectationRegisterForString{};
BinaryOperatorRegisterForB{};
BinaryOperatorRegisterForN{};
BinaryOperatorRegisterForZ{};
BinaryOperatorRegisterForR{};
BinaryOperatorRegisterForRn<1>{};
BinaryOperatorRegisterForRn<2>{};
BinaryOperatorRegisterForRn<3>{};
BinaryOperatorRegisterForRnxn<1>{};
BinaryOperatorRegisterForRnxn<2>{};
BinaryOperatorRegisterForRnxn<3>{};
BinaryOperatorRegisterForString{};
IncDecOperatorRegisterForN{};
IncDecOperatorRegisterForR{};
IncDecOperatorRegisterForZ{};
UnaryOperatorRegisterForB{};
UnaryOperatorRegisterForN{};
UnaryOperatorRegisterForZ{};
UnaryOperatorRegisterForR{};
UnaryOperatorRegisterForRn<1>{};
UnaryOperatorRegisterForRn<2>{};
UnaryOperatorRegisterForRn<3>{};
UnaryOperatorRegisterForRnxn<1>{};
UnaryOperatorRegisterForRnxn<2>{};
UnaryOperatorRegisterForRnxn<3>{};
}
......@@ -12,6 +12,8 @@ class CoreModule : public BuiltinModule
return "core";
}
void registerOperators() const final;
CoreModule();
~CoreModule() = default;
};
......
......@@ -25,6 +25,8 @@ class IModule
virtual const NameTypeMap& getNameTypeMap() const = 0;
virtual void registerOperators() const = 0;
virtual std::string_view name() const = 0;
virtual ~IModule() = default;
......
......@@ -90,3 +90,7 @@ LinearSolverModule::LinearSolverModule()
));
}
void
LinearSolverModule::registerOperators() const
{}
......@@ -12,6 +12,8 @@ class LinearSolverModule : public BuiltinModule
return "linear_solver";
}
void registerOperators() const final;
LinearSolverModule();
~LinearSolverModule() = default;
};
......
......@@ -70,3 +70,7 @@ MathModule::MathModule()
this->_addBuiltinFunction("round", std::make_shared<BuiltinFunctionEmbedder<int64_t(double)>>(
[](double x) -> int64_t { return std::lround(x); }));
}
void
MathModule::registerOperators() const
{}
......@@ -12,6 +12,8 @@ class MathModule : public BuiltinModule
return "math";
}
void registerOperators() const final;
MathModule();
~MathModule() = default;
......
......@@ -212,3 +212,7 @@ MeshModule::MeshModule()
));
}
void
MeshModule::registerOperators() const
{}
......@@ -20,6 +20,8 @@ class MeshModule : public BuiltinModule
return "mesh";
}
void registerOperators() const final;
MeshModule();
~MeshModule() = default;
......
......@@ -71,6 +71,14 @@ ModuleRepository::populateSymbolTable(const ASTNode& module_name_node, SymbolTab
if (i_module != m_module_set.end()) {
const IModule& populating_module = *i_module->second;
if (populating_module.isMandatory()) {
std::ostringstream error_message;
error_message << "module '" << rang::fgB::blue << module_name << rang::style::reset << rang::style::bold
<< "' is an autoload " << rang::fgB::yellow << "mandatory" << rang::style::reset
<< rang::style::bold << " module. It cannot be imported explicitly!";
throw ParseError(error_message.str(), module_name_node.begin());
}
this->_populateEmbedderTableT(module_name_node, module_name, populating_module.getNameBuiltinFunctionMap(),
ASTNodeDataType::build<ASTNodeDataType::builtin_function_t>(), symbol_table,
symbol_table.builtinFunctionEmbedderTable());
......@@ -100,6 +108,8 @@ ModuleRepository::populateMandatorySymbolTable(const ASTNode& root_node, SymbolT
this->_populateEmbedderTableT(root_node, module_name, i_module->getNameTypeMap(),
ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>(), symbol_table,
symbol_table.typeEmbedderTable());
i_module->registerOperators();
}
}
}
......@@ -123,6 +133,17 @@ ModuleRepository::getAvailableModules() const
return os.str();
}
void
ModuleRepository::registerOperators(const std::string& module_name)
{
auto i_module = m_module_set.find(module_name);
if (i_module != m_module_set.end()) {
i_module->second->registerOperators();
} else {
throw NormalError(std::string{"could not find module "} + module_name);
}
}
std::string
ModuleRepository::getModuleInfo(const std::string& module_name) const
{
......
......@@ -29,6 +29,7 @@ class ModuleRepository
public:
void populateSymbolTable(const ASTNode& module_name_node, SymbolTable& symbol_table);
void populateMandatorySymbolTable(const ASTNode& root_node, SymbolTable& symbol_table);
void registerOperators(const std::string& module_name);
std::string getAvailableModules() const;
std::string getModuleInfo(const std::string& module_name) const;
......
......@@ -280,3 +280,8 @@ SchemeModule::SchemeModule()
));
}
void
SchemeModule::registerOperators() const
{
}
......@@ -34,6 +34,8 @@ class SchemeModule : public BuiltinModule
return "scheme";
}
void registerOperators() const final;
SchemeModule();
~SchemeModule() = default;
......
......@@ -65,3 +65,7 @@ UtilsModule::UtilsModule()
));
}
void
UtilsModule::registerOperators() const
{}
......@@ -12,6 +12,8 @@ class UtilsModule : public BuiltinModule
return "utils";
}
void registerOperators() const final;
UtilsModule();
~UtilsModule() = default;
};
......
......@@ -100,3 +100,7 @@ WriterModule::WriterModule()
));
}
void
WriterModule::registerOperators() const
{}
......@@ -29,6 +29,8 @@ class WriterModule : public BuiltinModule
return "writer";
}
void registerOperators() const final;
WriterModule();
~WriterModule() = default;
......
#include <language/utils/OperatorRepository.hpp>
#include <language/utils/AffectationProcessorBuilder.hpp>
#include <language/utils/AffectationRegisterForB.hpp>
#include <language/utils/AffectationRegisterForN.hpp>
#include <language/utils/AffectationRegisterForR.hpp>
#include <language/utils/AffectationRegisterForRn.hpp>
#include <language/utils/AffectationRegisterForRnxn.hpp>
#include <language/utils/AffectationRegisterForString.hpp>
#include <language/utils/AffectationRegisterForZ.hpp>
#include <language/utils/BinaryOperatorRegisterForB.hpp>
#include <language/utils/BinaryOperatorRegisterForN.hpp>
#include <language/utils/BinaryOperatorRegisterForR.hpp>
#include <language/utils/BinaryOperatorRegisterForRn.hpp>
#include <language/utils/BinaryOperatorRegisterForRnxn.hpp>
#include <language/utils/BinaryOperatorRegisterForString.hpp>
#include <language/utils/BinaryOperatorRegisterForZ.hpp>
#include <language/utils/IncDecOperatorRegisterForN.hpp>
#include <language/utils/IncDecOperatorRegisterForR.hpp>
#include <language/utils/IncDecOperatorRegisterForZ.hpp>
#include <language/utils/UnaryOperatorRegisterForB.hpp>
#include <language/utils/UnaryOperatorRegisterForN.hpp>
#include <language/utils/UnaryOperatorRegisterForR.hpp>
#include <language/utils/UnaryOperatorRegisterForRn.hpp>
#include <language/utils/UnaryOperatorRegisterForRnxn.hpp>
#include <language/utils/UnaryOperatorRegisterForZ.hpp>
#include <utils/PugsAssert.hpp>
OperatorRepository* OperatorRepository::m_instance = nullptr;
......@@ -39,7 +11,6 @@ OperatorRepository::reset()
m_binary_operator_builder_list.clear();
m_inc_dec_operator_builder_list.clear();
m_unary_operator_builder_list.clear();
this->_initialize();
}
void
......@@ -47,7 +18,6 @@ OperatorRepository::create()
{
Assert(m_instance == nullptr, "AffectationRepository was already created");
m_instance = new OperatorRepository;
m_instance->_initialize();
}
void
......@@ -57,46 +27,3 @@ OperatorRepository::destroy()
delete m_instance;
m_instance = nullptr;
}
void
OperatorRepository::_initialize()
{
AffectationRegisterForB{};
AffectationRegisterForN{};
AffectationRegisterForZ{};
AffectationRegisterForR{};
AffectationRegisterForRn<1>{};
AffectationRegisterForRn<2>{};
AffectationRegisterForRn<3>{};
AffectationRegisterForRnxn<1>{};
AffectationRegisterForRnxn<2>{};
AffectationRegisterForRnxn<3>{};
AffectationRegisterForString{};
BinaryOperatorRegisterForB{};
BinaryOperatorRegisterForN{};
BinaryOperatorRegisterForZ{};
BinaryOperatorRegisterForR{};
BinaryOperatorRegisterForRn<1>{};
BinaryOperatorRegisterForRn<2>{};
BinaryOperatorRegisterForRn<3>{};
BinaryOperatorRegisterForRnxn<1>{};
BinaryOperatorRegisterForRnxn<2>{};
BinaryOperatorRegisterForRnxn<3>{};
BinaryOperatorRegisterForString{};
IncDecOperatorRegisterForN{};
IncDecOperatorRegisterForR{};
IncDecOperatorRegisterForZ{};
UnaryOperatorRegisterForB{};
UnaryOperatorRegisterForN{};
UnaryOperatorRegisterForZ{};
UnaryOperatorRegisterForR{};
UnaryOperatorRegisterForRn<1>{};
UnaryOperatorRegisterForRn<2>{};
UnaryOperatorRegisterForRn<3>{};
UnaryOperatorRegisterForRnxn<1>{};
UnaryOperatorRegisterForRnxn<2>{};
UnaryOperatorRegisterForRnxn<3>{};
}
......@@ -58,8 +58,6 @@ class OperatorRepository
std::unordered_map<std::string, Descriptor<IUnaryOperatorProcessorBuilder>> m_unary_operator_builder_list;
void _initialize();
public:
void reset();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment