diff --git a/lang/app/main.cpp b/lang/app/main.cpp index 9bfc041..40f0e57 100644 --- a/lang/app/main.cpp +++ b/lang/app/main.cpp @@ -11,7 +11,7 @@ int main(int argc, char **argv) { // - SourcesManager sources_manager(Log({}, {})); + SourcesManager sources_manager; sources_manager.AddFile(filename); sources_manager.Print(std::cout); diff --git a/lang/app/sources_manager.hpp b/lang/app/sources_manager.hpp index 4e3db4a..00a059c 100644 --- a/lang/app/sources_manager.hpp +++ b/lang/app/sources_manager.hpp @@ -1,7 +1,6 @@ #pragma once #include "basic_printers.hpp" -#include "error_handling.hpp" #include "expression_nodes.hpp" #include "log.hpp" #include "name_tree.hpp" @@ -17,10 +16,8 @@ class SourcesManager { public: - SourcesManager(Log &&log) : log_(std::move(log)) {} - void AddFile(const std::string &filename) { - Log::Context logc(log_, utils::Log::Area::kParse); + Log::Context logc(executor_.log(), utils::Log::Area::kParse); std::ifstream in; in.open(filename); @@ -40,8 +37,9 @@ public: {{"There are some parsing errors in file"}} /*,parse_tree.get_root()*/); } - auto new_statements = builders::build_source_file( - parse_tree.get_root(), expression_storage_, type_storage_, name_tree_); + builders::BuilderTask statements_builder(executor_); + + auto new_statements = statements_builder(parse_tree.get_root(), {}); statements_.reserve(statements_.size() + new_statements.size()); for (auto &new_statement : new_statements) { @@ -56,34 +54,6 @@ public: printers::print(statements_, printer); } - // - - nodes::ExpressionStorage &expressions() { return expression_storage_; } - - const nodes::ExpressionStorage &expressions() const { - return expression_storage_; - } - - // - - nodes::TypeStorage &types() { return type_storage_; } - - const nodes::TypeStorage &types() const { return type_storage_; } - - // - - names::NameTree &names() { return name_tree_; } - - const names::NameTree &names() const { return name_tree_; } - - // - - utils::Log &log() { return log_; } - - const utils::Log &log() const { return log_; } - - // - size_t statements_size() const { return statements_.size(); } nodes::Statement *statement(size_t id) { return &statements_.at(id); } @@ -93,9 +63,7 @@ public: } private: - Log log_; - nodes::ExpressionStorage expression_storage_ = {}; - nodes::TypeStorage type_storage_ = {}; - names::NameTree name_tree_ = {}; + builders::Executor executor_ = + builders::Executor(utils::BuildPrintLog(std::cout), {}, {}, {}, {}); std::vector statements_ = {}; }; diff --git a/lang/builders/include/builders_utils.hpp b/lang/builders/include/builders_utils.hpp index 7cf3022..4e35dab 100644 --- a/lang/builders/include/builders_utils.hpp +++ b/lang/builders/include/builders_utils.hpp @@ -11,14 +11,25 @@ using Exprs = nodes::ExpressionStorage; using Types = nodes::TypeStorage; using Names = names::NameTree; -using Executor = utils::Executor; +// + +struct State { + + std::optional last_defined_type_name; +}; + +// + +using Executor = utils::Executor; using ParserNode = parser::ParseTree::Node; -using Node = nodes::Node_>; // TODO +// using Node = nodes::Node_>; // TODO + +using Arguments = utils::None; template -using Task = utils::Task; +using Task = utils::Task; template struct BuilderTask { static_assert(false); @@ -28,8 +39,7 @@ template struct BuilderTaskBase : public Task { using Task::Task; template - OtherN Run(const parser::ParseTree::Node &node, - const utils::None &args = {}) { + OtherN Run(const parser::ParseTree::Node &node, const Arguments &args = {}) { BuilderTask task(this->executor); return task(node, args); } diff --git a/lang/builders/include/expression_builders.hpp b/lang/builders/include/expression_builders.hpp index 1e9614e..3243c26 100644 --- a/lang/builders/include/expression_builders.hpp +++ b/lang/builders/include/expression_builders.hpp @@ -29,7 +29,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::ExpressionProxy operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -38,7 +38,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Match::Case operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -46,7 +46,7 @@ struct BuilderTask : public BuilderTaskBase { using BuilderTaskBase::BuilderTaskBase; nodes::Match operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -55,7 +55,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Condition operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -63,7 +63,7 @@ struct BuilderTask : public BuilderTaskBase { using BuilderTaskBase::BuilderTaskBase; nodes::Loop operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; // --- operators @@ -74,7 +74,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::NameExpression operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -83,7 +83,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::NameExpression operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; // --- continers @@ -99,7 +99,7 @@ struct BuilderTask // or // '[[' expression+ ']]' nodes::Container operator()(const ParserNode &parser_node, - const utils::None &) override { + const Arguments &) override { const auto container_type = std::is_same_v ? nodes::Container::BLOCK : nodes::Container::ARRAY; @@ -125,7 +125,7 @@ struct BuilderTask : public BuilderTaskBase { using BuilderTaskBase::BuilderTaskBase; nodes::Return operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -134,7 +134,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::NameDefinition operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -143,7 +143,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Access operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -152,7 +152,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Access operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -161,25 +161,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::LoopControl operator()(const ParserNode &parser_node, - const utils::None &args) override; -}; - -template <> -struct BuilderTask - : public BuilderTaskBase { - using BuilderTaskBase::BuilderTaskBase; - - nodes::ModifierExpression operator()(const ParserNode &parser_node, - const utils::None &args) override; -}; - -template <> -struct BuilderTask - : public BuilderTaskBase { - using BuilderTaskBase::BuilderTaskBase; - - nodes::ModifierExpression operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template @@ -193,7 +175,7 @@ struct BuilderTask // or // expression ('?' | '!') nodes::ModifierExpression operator()(const ParserNode &parser_node, - const utils::None &) override { + const Arguments &) override { const size_t modifier_pos = std::is_same_v ? 0 : parser_node.child_count() - 1; @@ -212,7 +194,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::NameExpression operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -221,7 +203,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Constructor operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -229,7 +211,7 @@ struct BuilderTask : public BuilderTaskBase { using BuilderTaskBase::BuilderTaskBase; nodes::Lambda operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; } // namespace builders diff --git a/lang/builders/include/statement_builders.hpp b/lang/builders/include/statement_builders.hpp index caa8f19..58ed0db 100644 --- a/lang/builders/include/statement_builders.hpp +++ b/lang/builders/include/statement_builders.hpp @@ -20,7 +20,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Statements operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; // copy of statement inserted into name_tree @@ -30,7 +30,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Statement operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -38,7 +38,7 @@ struct BuilderTask : public BuilderTaskBase { using BuilderTaskBase::BuilderTaskBase; nodes::Import operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -47,7 +47,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::Constraint operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -56,7 +56,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::TypeDefinition operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; template <> @@ -65,7 +65,7 @@ struct BuilderTask using BuilderTaskBase::BuilderTaskBase; nodes::FunctionDefinition operator()(const ParserNode &parser_node, - const utils::None &args) override; + const Arguments &args) override; }; // const std::optional &previous_defined_type_name, // TODO diff --git a/lang/builders/src/expression_builders.cpp b/lang/builders/src/expression_builders.cpp index 42d33b3..e6781c7 100644 --- a/lang/builders/src/expression_builders.cpp +++ b/lang/builders/src/expression_builders.cpp @@ -12,7 +12,7 @@ namespace builders { nodes::ExpressionProxy BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { tokens::Type type = tokens::string_to_type(parser_node.get_type()); auto maybe_parenthesis = parser_node.previous_sibling(); @@ -150,7 +150,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // (':=' | '=:') expression (('??' | 'if') expression)? (_do_ expression)? nodes::Match::Case BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::string case_type = parser_node.nth_child(0).get_value(); std::optional condition_node; @@ -186,7 +186,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // expression case+ nodes::Match BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::vector cases; auto current_node = parser_node.nth_named_child(1); @@ -205,7 +205,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // expression)* (('!!=>', 'else') expression)? nodes::Condition BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { size_t named_child_count = parser_node.named_child_count(); std::vector> cases; @@ -233,7 +233,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // ('@' | 'for') (expression | expression ':' expression)? _do_ expression nodes::Loop BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { size_t named_child_count = parser_node.named_child_count(); if (named_child_count == 1) { // body @@ -282,7 +282,7 @@ nodes::Loop BuilderTask::operator()(const ParserNode &parser_node, // expression ',' expression nodes::NameExpression BuilderTask::operator()( - const ParserNode &parser_node, const utils::None &) { + const ParserNode &parser_node, const Arguments &) { std::vector, nodes::ExpressionProxy>> arguments; @@ -303,7 +303,7 @@ BuilderTask::operator()( // expression operator expression nodes::NameExpression BuilderTask::operator()( - const ParserNode &parser_node, const utils::None &) { + const ParserNode &parser_node, const Arguments &) { auto name_node = parser_node.child_by_field_name("na" "m" "e"); @@ -331,7 +331,7 @@ BuilderTask::operator()( // ('return' | 'bring') expression nodes::Return BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::string modifier = parser_node.nth_child(0).get_value(); return nodes::Return( @@ -347,7 +347,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // _var_let_ (simple_name_identifier | placeholder) nodes::NameDefinition BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::string modifier = parser_node.nth_child(0).get_value(); auto name_node = parser_node.nth_named_child(0); @@ -361,7 +361,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // expression '[' expression ']' nodes::Access BuilderTask::operator()( - const ParserNode &parser_node, const utils::None &) { + const ParserNode &parser_node, const Arguments &) { return nodes::Access( build_node(parser_node), nodes::Access::ARRAY, Run(parser_node.nth_named_child(0)), @@ -370,7 +370,7 @@ nodes::Access BuilderTask::operator()( // expression '.' number_literal nodes::Access BuilderTask::operator()( - const ParserNode &parser_node, const utils::None &) { + const ParserNode &parser_node, const Arguments &) { return nodes::Access( build_node(parser_node), nodes::Access::TUPLE, Run(parser_node.nth_named_child(0)), @@ -382,7 +382,7 @@ nodes::Access BuilderTask::operator()( // 'break' | 'continue' nodes::LoopControl BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { return nodes::LoopControl(build_node(parser_node), parser_node.get_value() == "br" "ea" @@ -408,7 +408,7 @@ void build_arguments_until_end( } else { arguments.emplace_back( std::move(last_annotation), - executor.Run(current_node)); + BuilderTask{executor}(current_node, {})); last_annotation = std::nullopt; } current_node = current_node.next_named_sibling(); @@ -419,7 +419,7 @@ void build_arguments_until_end( // ')') (annotation? expression)* nodes::NameExpression BuilderTask::operator()( - const ParserNode &parser_node, const utils::None &) { + const ParserNode &parser_node, const Arguments &) { std::vector arguments; std::optional prefix; @@ -466,7 +466,7 @@ BuilderTask::operator()( // type (annotation? expression)* nodes::Constructor BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::vector arguments; build_arguments_until_end(parser_node @@ -485,7 +485,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // '\\' argument_name* _do_ expression nodes::Lambda BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::vector arguments; auto current_node = diff --git a/lang/builders/src/statement_builders.cpp b/lang/builders/src/statement_builders.cpp index 28545e7..ea391e6 100644 --- a/lang/builders/src/statement_builders.cpp +++ b/lang/builders/src/statement_builders.cpp @@ -14,7 +14,6 @@ #include "utils.hpp" #include -#include #include namespace builders { @@ -22,16 +21,14 @@ namespace builders { // statement+ nodes::Statements BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::vector statements; std::optional last_defined_type_name; auto current_node = parser_node.nth_named_child(0); while (!current_node.is_null()) { - statements.push_back( - Run(current_node /* TODO , last_defined_type_name*/ - )); + statements.push_back(Run(current_node)); current_node = current_node.next_named_sibling(); } @@ -41,8 +38,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // import | type_definition | function_definition | typeclass_definition nodes::Statement BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { - // std::optional &last_defined_type_name, // TODO + const Arguments &) { tokens::Type type = tokens::string_to_type(parser_node.get_type()); std::optional statement_name; @@ -61,7 +57,7 @@ BuilderTask::operator()(const ParserNode &parser_node, case tokens::Type::TYPE_DEFINITION: statement = nodes::Statement(build_node(parser_node), Run(parser_node)); - last_defined_type_name = + state().last_defined_type_name = *statement.value().get().value()->get_name(); statement_name = *statement.value() .get() @@ -70,11 +66,8 @@ BuilderTask::operator()(const ParserNode &parser_node, ->get(); break; case tokens::Type::FUNCTION_DEFINITION: - statement = - nodes::Statement(build_node(parser_node), - Run( - parser_node /*, TODO last_defined_type_name*/ - )); + statement = nodes::Statement(build_node(parser_node), + Run(parser_node)); statement_name = *statement.value() .get() .value() @@ -115,7 +108,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // ('::' | 'import') simple_name ('=' simple_name)? (':' identifier*)? nodes::Import BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { auto name_node = parser_node.child_by_field_name("name"); auto module_node = parser_node.child_by_field_name("module"); @@ -138,7 +131,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // '?' expression nodes::Constraint BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { return nodes::Constraint( build_node(parser_node), Run(parser_node.nth_named_child(0))); @@ -177,7 +170,7 @@ parser::ParseTree::Node collect_symbol_doc_nodes( // (argument_type* '=' type)? ';' nodes::TypeDefinition BuilderTask::operator()(const ParserNode &parser_node, - const utils::None &) { + const Arguments &) { std::optional description_node; std::vector annotation_nodes; @@ -275,7 +268,7 @@ BuilderTask::operator()(const ParserNode &parser_node, // (annotation? _reference_ type)+)? // (((block | array) | '=' expression ';') | ';') nodes::FunctionDefinition BuilderTask::operator()( - const ParserNode &parser_node, const utils::None &) { + const ParserNode &parser_node, const Arguments &) { // const std::optional &last_defined_type_name, // TODO std::optional description_node; @@ -303,12 +296,12 @@ nodes::FunctionDefinition BuilderTask::operator()( current_node.get_value() == ".") { is_method = true; - if (!last_defined_type_name.has_value()) { + if (!state().last_defined_type_name.has_value()) { error_handling::handle_parsing_error( "Can't define method without associated type", parser_node); } - name_prefix = last_defined_type_name.value(); + name_prefix = state().last_defined_type_name.value(); } nodes::Modifier return_modifier = nodes::Modifier::NONE; diff --git a/lang/nodes/include/nodes_storage.hpp b/lang/nodes/include/nodes_storage.hpp index 8cc60cb..b31d26f 100644 --- a/lang/nodes/include/nodes_storage.hpp +++ b/lang/nodes/include/nodes_storage.hpp @@ -16,8 +16,8 @@ class NodeStorage : public core::Storage { public: Id Insert(NodeData &&elem) { const auto id = NewId(); - utils::Assert(data_.insert({id, std::move(elem)}).second, - std::format("insert failed, id={}", *id)); + ::utils::Assert(data_.insert({id, std::move(elem)}).second, + std::format("insert failed, id={}", *id)); return id; } diff --git a/lang/printers/src/statement_printers.cpp b/lang/printers/src/statement_printers.cpp index 1b2083f..a063340 100644 --- a/lang/printers/src/statement_printers.cpp +++ b/lang/printers/src/statement_printers.cpp @@ -20,6 +20,10 @@ namespace printers { void print(const nodes::Statement &statement, Printer &printer) { std::visit([&printer](const auto &arg) -> void { print(arg, printer); }, *statement.get_any()); + + if (not statement.get().has_value()) { + printer.new_indent_line(); + } } void print(const nodes::Import &statement, Printer &printer) { diff --git a/lang/utils/include/executor.hpp b/lang/utils/include/executor.hpp index 4ea51d9..8c45451 100644 --- a/lang/utils/include/executor.hpp +++ b/lang/utils/include/executor.hpp @@ -23,9 +23,9 @@ public: // - template T Run(Args... args) { - return T(*this, args...); - } + // template T Run(Args &&...args) { + // return T(*this, std::forward(args)...); + // } template T &state() { return ExecutorState::state_; } template const T &state() const { diff --git a/lang/utils/include/storage.hpp b/lang/utils/include/storage.hpp index b6e10f5..e98aaf5 100644 --- a/lang/utils/include/storage.hpp +++ b/lang/utils/include/storage.hpp @@ -22,6 +22,12 @@ struct Id { } // namespace storage +template <> struct std::hash { + std::size_t operator()(const storage::Id &id) const noexcept { + return std::hash{}(id.id); + } +}; + namespace core { // TODO: move all important to core template class Storage { diff --git a/lang/utils/src/log.cpp b/lang/utils/src/log.cpp index 6189aaf..5ab6f2f 100644 --- a/lang/utils/src/log.cpp +++ b/lang/utils/src/log.cpp @@ -42,10 +42,10 @@ std::string to_string(Log::Message message) { // -inline Log BuildPrintLog(std::ostream &out, Log::Level min_level) { +Log BuildPrintLog(std::ostream &out, Log::Level min_level) { auto const print = [&out, min_level](const Log::Message &message) { if (message.level >= min_level) { - out << to_string(message); + out << to_string(message) << std::endl; } }; return Log(print, print);