diff --git a/include/error_handling.hpp b/include/error_handling.hpp index fad9af1..d99e443 100644 --- a/include/error_handling.hpp +++ b/include/error_handling.hpp @@ -29,6 +29,11 @@ inline void HandleParsingError(const std::string& message, exit(1); } +inline void HandleGeneralError(const std::string& message) { + std::cout << "General Error: " << message << ".\n"; + exit(1); +} + inline void HandleInternalError(const std::string& message, const std::string& place) { std::cout << "Internal Error: " << message << " at " << place << ".\n"; exit(1); diff --git a/include/interpreter_tree.hpp b/include/interpreter_tree.hpp index 8deef00..93f124d 100644 --- a/include/interpreter_tree.hpp +++ b/include/interpreter_tree.hpp @@ -194,8 +194,7 @@ struct ArrayExpression; struct PartitionName { BaseNode base; - std::vector path; - NameIdentifier name; + std::vector path; // name is last element of path }; struct NameExpression; diff --git a/src/build_visitor.cpp b/src/build_visitor.cpp index f567fd9..1e9e59a 100644 --- a/src/build_visitor.cpp +++ b/src/build_visitor.cpp @@ -1158,7 +1158,7 @@ void BuildVisitor::Visit(PartitionName* node) { } } - node->name = parse_node.ChildByFieldName("name").GetValue(); + node->path.push_back(parse_node.ChildByFieldName("name").GetValue()); current_node_ = parse_node; } diff --git a/src/find_symbols_visitor.cpp b/src/find_symbols_visitor.cpp index c4b4129..0225ecd 100644 --- a/src/find_symbols_visitor.cpp +++ b/src/find_symbols_visitor.cpp @@ -175,7 +175,7 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) { void FindSymbolsVisitor::Visit(PartitionStatement* node) { is_in_statement_ = true; - node->executable_id_ = namespace_visitor_.AddPartition(node->name.path, node->name.name, node); + node->executable_id_ = namespace_visitor_.AddPartition(node->name.path, node); // TODO: typecheck error on same tests is_in_statement_ = false; diff --git a/src/main.cpp b/src/main.cpp index ef4ee9d..438713a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,7 +37,7 @@ int main(int argc, char** argv) { // TODO, only test version parser::ParseTree parse_tree(source); if (!parse_tree.IsProperlyParsed()) { - error_handling::HandleParsingError("There are some parsing errors in file.", {0, 0}, {0, 0}); + error_handling::HandleParsingError("There are some parsing errors in file", {0, 0}, {0, 0}); } std::unique_ptr source_file = @@ -53,10 +53,6 @@ int main(int argc, char** argv) { // TODO, only test version interpreter::LinkSymbolsVisitor link_symbols_visitor(global_info); interpreter::TypeCheckVisitor type_check_visitor(global_info, type_context_manager); interpreter::TypedPrintVisitor typed_print_visitor(std::cout, type_context_manager); - interpreter::ExecuteVisitor execute_visitor(global_info, - type_context_manager, - context_manager, - nullptr); // TODO build_visitor.VisitSourceFile(source_file.get()); @@ -67,6 +63,20 @@ int main(int argc, char** argv) { // TODO, only test version link_symbols_visitor.VisitSourceFile(source_file.get()); type_check_visitor.VisitSourceFile(source_file.get()); + std::optional maybe_main_partition_id = global_info.FindPartition({"main"}); + + if (!maybe_main_partition_id.has_value()) { + error_handling::HandleGeneralError("No main partition found"); + } + + const info::GlobalInfo::PartitionInfo& main_partition = + global_info.GetPartitionInfo(maybe_main_partition_id.value()); + + interpreter::ExecuteVisitor execute_visitor(global_info, + type_context_manager, + context_manager, + main_partition.node); + std::cout << "\n---------------------------------- Typed -------------------------------------\n\n"; typed_print_visitor.VisitSourceFile(source_file.get()); } diff --git a/src/print_visitor.cpp b/src/print_visitor.cpp index 825964e..8ed7350 100644 --- a/src/print_visitor.cpp +++ b/src/print_visitor.cpp @@ -554,11 +554,12 @@ void PrintVisitor::Visit(ArrayExpression* node) { void PrintVisitor::Visit(PartitionName* node) { out_ << "[PartitionName] ("; - for (auto& path_namespace : node->path) { - Visit(&path_namespace); - out_ << "::"; + for (size_t i = 0; i < node->path.size(); ++i) { + Visit(&node->path[i]); + if (i + 1 < node->path.size()) { + out_ << "::"; + } } - Visit(&node->name); out_ << ')'; } diff --git a/src/typed_print_visitor.cpp b/src/typed_print_visitor.cpp index a5cc24e..343894a 100644 --- a/src/typed_print_visitor.cpp +++ b/src/typed_print_visitor.cpp @@ -782,11 +782,12 @@ void TypedPrintVisitor::Visit(PartitionName* node) { } out_ << "] ("; - for (auto& path_namespace : node->path) { - Visit(&path_namespace); - out_ << "::"; + for (size_t i = 0; i < node->path.size(); ++i) { + Visit(&node->path[i]); + if (i + 1 < node->path.size()) { + out_ << "::"; + } } - Visit(&node->name); out_ << ')'; } diff --git a/src/visitor.cpp b/src/visitor.cpp index e39d3e3..3ed7e22 100644 --- a/src/visitor.cpp +++ b/src/visitor.cpp @@ -567,7 +567,6 @@ void Visitor::Visit(PartitionName* node) { for (auto& path_namespace : node->path) { Visit(&path_namespace); } - Visit(&node->name); } void Visitor::Visit(NameExpression* node) {