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/ast/ASTModulesImporter.hpp>
#include <language/PEGGrammar.hpp> #include <language/PEGGrammar.hpp>
#include <language/utils/OperatorRepository.hpp>
void void
ASTModulesImporter::_importModule(ASTNode& import_node) ASTModulesImporter::_importModule(ASTNode& import_node)
...@@ -20,6 +21,7 @@ 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"; 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.populateSymbolTable(module_name_node, m_symbol_table);
m_module_repository.registerOperators(module_name);
} }
void void
...@@ -37,6 +39,7 @@ ASTModulesImporter::_importAllModules(ASTNode& node) ...@@ -37,6 +39,7 @@ ASTModulesImporter::_importAllModules(ASTNode& node)
ASTModulesImporter::ASTModulesImporter(ASTNode& root_node) : m_symbol_table{*root_node.m_symbol_table} ASTModulesImporter::ASTModulesImporter(ASTNode& root_node) : m_symbol_table{*root_node.m_symbol_table}
{ {
Assert(root_node.is_root()); Assert(root_node.is_root());
OperatorRepository::instance().reset();
m_module_repository.populateMandatorySymbolTable(root_node, m_symbol_table); m_module_repository.populateMandatorySymbolTable(root_node, m_symbol_table);
this->_importAllModules(root_node); this->_importAllModules(root_node);
......
#include <language/modules/CoreModule.hpp> #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/CoreModule.hpp>
#include <language/modules/ModuleRepository.hpp> #include <language/modules/ModuleRepository.hpp>
#include <language/utils/ASTExecutionInfo.hpp> #include <language/utils/ASTExecutionInfo.hpp>
...@@ -42,3 +70,46 @@ CoreModule::CoreModule() : BuiltinModule(true) ...@@ -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 ...@@ -12,6 +12,8 @@ class CoreModule : public BuiltinModule
return "core"; return "core";
} }
void registerOperators() const final;
CoreModule(); CoreModule();
~CoreModule() = default; ~CoreModule() = default;
}; };
......
...@@ -25,6 +25,8 @@ class IModule ...@@ -25,6 +25,8 @@ class IModule
virtual const NameTypeMap& getNameTypeMap() const = 0; virtual const NameTypeMap& getNameTypeMap() const = 0;
virtual void registerOperators() const = 0;
virtual std::string_view name() const = 0; virtual std::string_view name() const = 0;
virtual ~IModule() = default; virtual ~IModule() = default;
......
...@@ -90,3 +90,7 @@ LinearSolverModule::LinearSolverModule() ...@@ -90,3 +90,7 @@ LinearSolverModule::LinearSolverModule()
)); ));
} }
void
LinearSolverModule::registerOperators() const
{}
...@@ -12,6 +12,8 @@ class LinearSolverModule : public BuiltinModule ...@@ -12,6 +12,8 @@ class LinearSolverModule : public BuiltinModule
return "linear_solver"; return "linear_solver";
} }
void registerOperators() const final;
LinearSolverModule(); LinearSolverModule();
~LinearSolverModule() = default; ~LinearSolverModule() = default;
}; };
......
...@@ -70,3 +70,7 @@ MathModule::MathModule() ...@@ -70,3 +70,7 @@ MathModule::MathModule()
this->_addBuiltinFunction("round", std::make_shared<BuiltinFunctionEmbedder<int64_t(double)>>( this->_addBuiltinFunction("round", std::make_shared<BuiltinFunctionEmbedder<int64_t(double)>>(
[](double x) -> int64_t { return std::lround(x); })); [](double x) -> int64_t { return std::lround(x); }));
} }
void
MathModule::registerOperators() const
{}
...@@ -12,6 +12,8 @@ class MathModule : public BuiltinModule ...@@ -12,6 +12,8 @@ class MathModule : public BuiltinModule
return "math"; return "math";
} }
void registerOperators() const final;
MathModule(); MathModule();
~MathModule() = default; ~MathModule() = default;
......
...@@ -212,3 +212,7 @@ MeshModule::MeshModule() ...@@ -212,3 +212,7 @@ MeshModule::MeshModule()
)); ));
} }
void
MeshModule::registerOperators() const
{}
...@@ -20,6 +20,8 @@ class MeshModule : public BuiltinModule ...@@ -20,6 +20,8 @@ class MeshModule : public BuiltinModule
return "mesh"; return "mesh";
} }
void registerOperators() const final;
MeshModule(); MeshModule();
~MeshModule() = default; ~MeshModule() = default;
......
...@@ -71,6 +71,14 @@ ModuleRepository::populateSymbolTable(const ASTNode& module_name_node, SymbolTab ...@@ -71,6 +71,14 @@ ModuleRepository::populateSymbolTable(const ASTNode& module_name_node, SymbolTab
if (i_module != m_module_set.end()) { if (i_module != m_module_set.end()) {
const IModule& populating_module = *i_module->second; 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(), this->_populateEmbedderTableT(module_name_node, module_name, populating_module.getNameBuiltinFunctionMap(),
ASTNodeDataType::build<ASTNodeDataType::builtin_function_t>(), symbol_table, ASTNodeDataType::build<ASTNodeDataType::builtin_function_t>(), symbol_table,
symbol_table.builtinFunctionEmbedderTable()); symbol_table.builtinFunctionEmbedderTable());
...@@ -100,6 +108,8 @@ ModuleRepository::populateMandatorySymbolTable(const ASTNode& root_node, SymbolT ...@@ -100,6 +108,8 @@ ModuleRepository::populateMandatorySymbolTable(const ASTNode& root_node, SymbolT
this->_populateEmbedderTableT(root_node, module_name, i_module->getNameTypeMap(), this->_populateEmbedderTableT(root_node, module_name, i_module->getNameTypeMap(),
ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>(), symbol_table, ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>(), symbol_table,
symbol_table.typeEmbedderTable()); symbol_table.typeEmbedderTable());
i_module->registerOperators();
} }
} }
} }
...@@ -123,6 +133,17 @@ ModuleRepository::getAvailableModules() const ...@@ -123,6 +133,17 @@ ModuleRepository::getAvailableModules() const
return os.str(); 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 std::string
ModuleRepository::getModuleInfo(const std::string& module_name) const ModuleRepository::getModuleInfo(const std::string& module_name) const
{ {
......
...@@ -29,6 +29,7 @@ class ModuleRepository ...@@ -29,6 +29,7 @@ class ModuleRepository
public: public:
void populateSymbolTable(const ASTNode& module_name_node, SymbolTable& symbol_table); void populateSymbolTable(const ASTNode& module_name_node, SymbolTable& symbol_table);
void populateMandatorySymbolTable(const ASTNode& root_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 getAvailableModules() const;
std::string getModuleInfo(const std::string& module_name) const; std::string getModuleInfo(const std::string& module_name) const;
......
...@@ -280,3 +280,8 @@ SchemeModule::SchemeModule() ...@@ -280,3 +280,8 @@ SchemeModule::SchemeModule()
)); ));
} }
void
SchemeModule::registerOperators() const
{
}
...@@ -34,6 +34,8 @@ class SchemeModule : public BuiltinModule ...@@ -34,6 +34,8 @@ class SchemeModule : public BuiltinModule
return "scheme"; return "scheme";
} }
void registerOperators() const final;
SchemeModule(); SchemeModule();
~SchemeModule() = default; ~SchemeModule() = default;
......
...@@ -65,3 +65,7 @@ UtilsModule::UtilsModule() ...@@ -65,3 +65,7 @@ UtilsModule::UtilsModule()
)); ));
} }
void
UtilsModule::registerOperators() const
{}
...@@ -12,6 +12,8 @@ class UtilsModule : public BuiltinModule ...@@ -12,6 +12,8 @@ class UtilsModule : public BuiltinModule
return "utils"; return "utils";
} }
void registerOperators() const final;
UtilsModule(); UtilsModule();
~UtilsModule() = default; ~UtilsModule() = default;
}; };
......
...@@ -100,3 +100,7 @@ WriterModule::WriterModule() ...@@ -100,3 +100,7 @@ WriterModule::WriterModule()
)); ));
} }
void
WriterModule::registerOperators() const
{}
...@@ -29,6 +29,8 @@ class WriterModule : public BuiltinModule ...@@ -29,6 +29,8 @@ class WriterModule : public BuiltinModule
return "writer"; return "writer";
} }
void registerOperators() const final;
WriterModule(); WriterModule();
~WriterModule() = default; ~WriterModule() = default;
......
#include <language/utils/OperatorRepository.hpp> #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> #include <utils/PugsAssert.hpp>
OperatorRepository* OperatorRepository::m_instance = nullptr; OperatorRepository* OperatorRepository::m_instance = nullptr;
...@@ -39,7 +11,6 @@ OperatorRepository::reset() ...@@ -39,7 +11,6 @@ OperatorRepository::reset()
m_binary_operator_builder_list.clear(); m_binary_operator_builder_list.clear();
m_inc_dec_operator_builder_list.clear(); m_inc_dec_operator_builder_list.clear();
m_unary_operator_builder_list.clear(); m_unary_operator_builder_list.clear();
this->_initialize();
} }
void void
...@@ -47,7 +18,6 @@ OperatorRepository::create() ...@@ -47,7 +18,6 @@ OperatorRepository::create()
{ {
Assert(m_instance == nullptr, "AffectationRepository was already created"); Assert(m_instance == nullptr, "AffectationRepository was already created");
m_instance = new OperatorRepository; m_instance = new OperatorRepository;
m_instance->_initialize();
} }
void void
...@@ -57,46 +27,3 @@ OperatorRepository::destroy() ...@@ -57,46 +27,3 @@ OperatorRepository::destroy()
delete m_instance; delete m_instance;
m_instance = nullptr; 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 ...@@ -58,8 +58,6 @@ class OperatorRepository
std::unordered_map<std::string, Descriptor<IUnaryOperatorProcessorBuilder>> m_unary_operator_builder_list; std::unordered_map<std::string, Descriptor<IUnaryOperatorProcessorBuilder>> m_unary_operator_builder_list;
void _initialize();
public: public:
void reset(); void reset();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment