2023-03-31 12:10:12 +03:00
|
|
|
#include <fstream>
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <sstream>
|
|
|
|
|
|
|
|
|
|
// for clangd
|
|
|
|
|
#include "../include/parse_tree.hpp"
|
2023-05-07 15:17:37 +03:00
|
|
|
#include "../include/global_info.hpp"
|
2023-03-31 12:10:12 +03:00
|
|
|
#include "../include/interpreter_tree.hpp"
|
|
|
|
|
#include "../include/build_visitor.hpp"
|
|
|
|
|
#include "../include/print_visitor.hpp"
|
2023-05-07 15:17:37 +03:00
|
|
|
#include "../include/find_symbols_visitor.hpp"
|
|
|
|
|
#include "../include/link_symbols_visitor.hpp"
|
|
|
|
|
#include "../include/type_check_visitor.hpp"
|
|
|
|
|
#include "../include/typed_print_visitor.hpp"
|
2023-05-09 15:51:13 +03:00
|
|
|
#include "../include/execute_visitor.hpp"
|
2023-05-05 11:59:02 +03:00
|
|
|
#include "../include/error_handling.hpp"
|
2023-03-31 12:10:12 +03:00
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
2023-05-05 11:59:02 +03:00
|
|
|
if (!parse_tree.IsProperlyParsed()) {
|
2023-05-06 19:26:14 +03:00
|
|
|
error_handling::HandleParsingError("There are some parsing errors in file.", {0, 0}, {0, 0});
|
2023-05-05 11:59:02 +03:00
|
|
|
}
|
|
|
|
|
|
2023-03-31 12:10:12 +03:00
|
|
|
std::unique_ptr<interpreter::tokens::SourceFile> source_file =
|
|
|
|
|
std::make_unique<interpreter::tokens::SourceFile>();
|
|
|
|
|
|
2023-05-07 15:17:37 +03:00
|
|
|
info::GlobalInfo global_info;
|
2023-05-09 15:51:13 +03:00
|
|
|
info::ContextManager<info::type::Type, info::type::TypeManager> type_context_manager;
|
|
|
|
|
info::ContextManager<info::value::Value, info::value::ValueManager> context_manager;
|
2023-05-07 15:17:37 +03:00
|
|
|
|
2023-03-31 12:10:12 +03:00
|
|
|
interpreter::BuildVisitor build_visitor(parse_tree);
|
2023-05-07 19:52:35 +03:00
|
|
|
interpreter::PrintVisitor print_visitor(std::cout);
|
2023-05-07 15:17:37 +03:00
|
|
|
interpreter::FindSymbolsVisitor find_symbols_visitor(global_info);
|
|
|
|
|
interpreter::LinkSymbolsVisitor link_symbols_visitor(global_info);
|
2023-05-09 15:51:13 +03:00
|
|
|
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
|
2023-03-31 12:10:12 +03:00
|
|
|
|
|
|
|
|
build_visitor.VisitSourceFile(source_file.get());
|
2023-05-07 19:52:35 +03:00
|
|
|
|
|
|
|
|
std::cout << "\n---------------------------------- Untyped -------------------------------------\n\n";
|
|
|
|
|
print_visitor.VisitSourceFile(source_file.get());
|
|
|
|
|
|
2023-05-07 15:17:37 +03:00
|
|
|
find_symbols_visitor.VisitSourceFile(source_file.get());
|
|
|
|
|
link_symbols_visitor.VisitSourceFile(source_file.get());
|
|
|
|
|
type_check_visitor.VisitSourceFile(source_file.get());
|
2023-05-07 19:52:35 +03:00
|
|
|
|
|
|
|
|
std::cout << "\n---------------------------------- Typed -------------------------------------\n\n";
|
2023-05-07 15:17:37 +03:00
|
|
|
typed_print_visitor.VisitSourceFile(source_file.get());
|
2023-03-31 12:10:12 +03:00
|
|
|
}
|