From 6b74398f8cc1fc5fd5c3c4ed1aed4fd9d368d4f7 Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Wed, 26 Jul 2023 14:21:33 +0300 Subject: [PATCH] statement node added --- include/expression_nodes.hpp | 5 +-- include/statement_builders.hpp | 17 +++++---- include/statement_nodes.hpp | 29 +++++++++++++++ include/statement_printers.hpp | 7 +++- src/main.cpp | 9 ++++- src/statement_builders.cpp | 67 ++++++++++++---------------------- src/statement_printers.cpp | 34 +++++++++++++++++ 7 files changed, 108 insertions(+), 60 deletions(-) diff --git a/include/expression_nodes.hpp b/include/expression_nodes.hpp index 72283ba..dface30 100644 --- a/include/expression_nodes.hpp +++ b/include/expression_nodes.hpp @@ -536,7 +536,6 @@ public: private: std::variant< - // --- flow control Match, Condition, Loop, @@ -563,9 +562,7 @@ private: Literal, // --- empty lines - EmptyLines - - > + EmptyLines> expression_; bool is_scoped_ = false; diff --git a/include/statement_builders.hpp b/include/statement_builders.hpp index 5e2dec0..852ecd0 100644 --- a/include/statement_builders.hpp +++ b/include/statement_builders.hpp @@ -3,17 +3,18 @@ #include "statement_nodes.hpp" #include "tree_sitter_wrapper.hpp" +#include + namespace builders { -// IN PROGRESS: return type, etc. -void build_source_file(parser::ParseTree::Node parser_node, - nodes::ExpressionStorage &expression_storage, - nodes::TypeStorage &type_storage); +std::vector +build_source_file(parser::ParseTree::Node parser_node, + nodes::ExpressionStorage &expression_storage, + nodes::TypeStorage &type_storage); -// IN PROGRESS: return type, etc. -void build_statement(parser::ParseTree::Node parser_node, - nodes::ExpressionStorage &expression_storage, - nodes::TypeStorage &type_storage); +nodes::Statement build_statement(parser::ParseTree::Node parser_node, + nodes::ExpressionStorage &expression_storage, + nodes::TypeStorage &type_storage); nodes::Import build_import(parser::ParseTree::Node parser_node); diff --git a/include/statement_nodes.hpp b/include/statement_nodes.hpp index 73a3999..c86929d 100644 --- a/include/statement_nodes.hpp +++ b/include/statement_nodes.hpp @@ -385,4 +385,33 @@ private: std::vector methods_; }; +class Statement { +public: + template + Statement(T &&statement) : expression_(std::forward(statement)) {} + + template std::optional get() { + if (std::holds_alternative(expression_)) { + return &std::get(expression_); + } + return std::nullopt; + } + + template std::optional get() const { + if (std::holds_alternative(expression_)) { + return &std::get(expression_); + } + return std::nullopt; + } + + auto get_any() { return &expression_; } + + auto get_any() const { return &expression_; } + +private: + std::variant + expression_; +}; + } // namespace nodes diff --git a/include/statement_printers.hpp b/include/statement_printers.hpp index 40bc228..fe1f488 100644 --- a/include/statement_printers.hpp +++ b/include/statement_printers.hpp @@ -3,11 +3,14 @@ #include "basic_printers.hpp" #include "statement_nodes.hpp" +#include + namespace printers { -// void print_source_file(Printer &printer); // TODO +void print_source_file(const std::vector &statements, + Printer &printer); -// void print_statement(Printer &printer); // TODO +void print_statement(const nodes::Statement &statements, Printer &printer); void print_import(const nodes::Import &statement, Printer &printer); diff --git a/src/main.cpp b/src/main.cpp index 887f288..9cfe38c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,9 +2,11 @@ #include #include +#include "basic_printers.hpp" #include "error_handling.hpp" #include "expression_nodes.hpp" #include "statement_builders.hpp" +#include "statement_printers.hpp" #include "type_nodes.hpp" int main(int argc, char **argv) { @@ -37,6 +39,9 @@ int main(int argc, char **argv) { nodes::ExpressionStorage expression_storage; nodes::TypeStorage type_storage; - builders::build_source_file(parse_tree.get_root(), expression_storage, - type_storage); + auto statements = builders::build_source_file( + parse_tree.get_root(), expression_storage, type_storage); + + printers::Printer printer(std::cout, 2, 80, false); + printers::print_source_file(statements, printer); } diff --git a/src/statement_builders.cpp b/src/statement_builders.cpp index 562e543..fb1a5b3 100644 --- a/src/statement_builders.cpp +++ b/src/statement_builders.cpp @@ -2,86 +2,65 @@ #include "basic_builders.hpp" #include "basic_nodes.hpp" -#include "basic_printers.hpp" #include "doc_builders.hpp" #include "doc_nodes.hpp" #include "error_handling.hpp" #include "expression_builders.hpp" #include "statement_nodes.hpp" -#include "statement_printers.hpp" #include "tokens.hpp" #include "tree_sitter_wrapper.hpp" #include "type_builders.hpp" #include "type_nodes.hpp" + #include #include #include namespace builders { -// TODO: return some info ?? // statement+ -void build_source_file(parser::ParseTree::Node parser_node, - nodes::ExpressionStorage &expression_storage, - nodes::TypeStorage &type_storage) { +std::vector +build_source_file(parser::ParseTree::Node parser_node, + nodes::ExpressionStorage &expression_storage, + nodes::TypeStorage &type_storage) { + std::vector statements; + auto current_node = parser_node.nth_named_child(0); while (!current_node.is_null()) { - build_statement(current_node, expression_storage, type_storage); - // TODO: do something with statement + statements.push_back( + build_statement(current_node, expression_storage, type_storage)); current_node = current_node.next_named_sibling(); } + + return statements; } -// TODO: return some info ?? // import | type_definition | function_definition | typeclass_definition -void build_statement(parser::ParseTree::Node parser_node, - nodes::ExpressionStorage &expression_storage, - nodes::TypeStorage &type_storage) { +nodes::Statement build_statement(parser::ParseTree::Node parser_node, + nodes::ExpressionStorage &expression_storage, + nodes::TypeStorage &type_storage) { tokens::Type type = tokens::string_to_type(parser_node.get_type()); - printers::Printer printer(std::cout, 2, 80, false); - switch (type) { case tokens::Type::IMPORT: - build_import(parser_node); - printers::print_import(build_import(parser_node), - printer); // TODO TEMPORARY - printer.new_indent_line(); - return; + return nodes::Statement(build_import(parser_node)); case tokens::Type::TYPE_DEFINITION: - build_type_definition(parser_node, expression_storage, type_storage); - printers::print_type_definition( - build_type_definition(parser_node, expression_storage, type_storage), - printer); // TODO TEMPORARY - printer.new_indent_line(); - return; + return nodes::Statement( + build_type_definition(parser_node, expression_storage, type_storage)); case tokens::Type::FUNCTION_DEFINITION: - build_function_definition(parser_node, expression_storage, type_storage); - printers::print_function_definition( - build_function_definition(parser_node, expression_storage, - type_storage), - printer); // TODO TEMPORARY - printer.new_indent_line(); - return; + return nodes::Statement(build_function_definition( + parser_node, expression_storage, type_storage)); case tokens::Type::TYPECLASS_DEFINITION: - build_typeclass_definition(parser_node, expression_storage, type_storage); - printers::print_typeclass_definition( - build_typeclass_definition(parser_node, expression_storage, - type_storage), - printer); // TODO TEMPORARY - printer.new_indent_line(); - return; + return nodes::Statement(build_typeclass_definition( + parser_node, expression_storage, type_storage)); case tokens::Type::EMPTY_LINES: - build_empty_lines(parser_node); - printers::print_empty_lines(build_empty_lines(parser_node), - printer); // TODO TEMPORARY - return; + return nodes::Statement(build_empty_lines(parser_node)); default: error_handling::handle_parsing_error("Unexprected statement node type", parser_node); } error_handling::handle_general_error("Unreachable"); - exit(1); // unreachable} // IN PROCESS + exit(1); // unreachable } // ('::' | 'import') simple_name ('=' simple_name)? (':' identifier*)? diff --git a/src/statement_printers.cpp b/src/statement_printers.cpp index b3d2381..2f83478 100644 --- a/src/statement_printers.cpp +++ b/src/statement_printers.cpp @@ -8,6 +8,40 @@ namespace printers { +void print_source_file(const std::vector &statements, + Printer &printer) { + for (auto &statement : statements) { + print_statement(statement, printer); + } +} + +void print_statement(const nodes::Statement &statement, Printer &printer) { + switch (statement.get_any()->index()) { + case 0: // Import + print_import(*statement.get().value(), printer); + printer.new_indent_line(); + break; + case 1: // TypeDefinition + print_type_definition(*statement.get().value(), + printer); + printer.new_indent_line(); + break; + case 2: // FunctionDefinition + print_function_definition( + *statement.get().value(), printer); + printer.new_indent_line(); + break; + case 3: // TypeclassDefinition + print_typeclass_definition( + *statement.get().value(), printer); + printer.new_indent_line(); + break; + case 4: // EmptyLines + print_empty_lines(*statement.get().value(), printer); + break; + } +} + void print_import(const nodes::Import &statement, Printer &printer) { printer.print(":: ");