#include #include #include // for clangd #include "../include/parse_tree.hpp" #include "../include/global_info.hpp" #include "../include/interpreter_tree.hpp" #include "../include/build_visitor.hpp" #include "../include/print_visitor.hpp" #include "../include/find_symbols_visitor.hpp" #include "../include/link_symbols_visitor.hpp" #include "../include/type_check_visitor.hpp" #include "../include/typed_print_visitor.hpp" #include "../include/execute_visitor.hpp" #include "../include/error_handling.hpp" int main(int argc, char** argv) { // TODO, only test version if (argc < 2 || argc > 2) { std::cout << "Wrong argument count (provide one argument - source file)\n"; return 0; } std::string filename = argv[1]; std::ifstream in; in.open(filename); // TODO handle errors std::stringstream source_stream; source_stream << in.rdbuf(); in.close(); std::string source = source_stream.str(); parser::ParseTree parse_tree(source); if (!parse_tree.IsProperlyParsed()) { error_handling::HandleParsingError("There are some parsing errors in file", {0, 0}, {0, 0}); } std::unique_ptr source_file = std::make_unique(); info::GlobalInfo global_info; info::ContextManager type_context_manager; info::ContextManager context_manager; interpreter::BuildVisitor build_visitor(parse_tree); interpreter::PrintVisitor print_visitor(std::cout); interpreter::FindSymbolsVisitor find_symbols_visitor(global_info); 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); build_visitor.VisitSourceFile(source_file.get()); std::cout << "\n---------------------------------- Untyped -------------------------------------\n\n"; print_visitor.VisitSourceFile(source_file.get()); find_symbols_visitor.VisitSourceFile(source_file.get()); 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); execute_visitor.ExecutePartition(main_partition.node); std::cout << "\n---------------------------------- Typed -------------------------------------\n\n"; typed_print_visitor.VisitSourceFile(source_file.get()); }