#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); interpreter::ExecuteVisitor execute_visitor(global_info, type_context_manager, context_manager, nullptr); // TODO 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::cout << "\n---------------------------------- Typed -------------------------------------\n\n"; typed_print_visitor.VisitSourceFile(source_file.get()); }