4
Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
6
https://bmstu.codes/lsx/simodo/loom
9
/*! \file Интерпретация текста
11
* Утилита интерпретации текста на любом языке, заданном грамматикой на языке SIMODO fuze.
16
#include "simodo/engine/FrameBody.h"
17
#include "simodo/inout/token/RegularInputStreamSupplier.h"
18
#include "simodo/inout/reporter/ConsoleReporter.h"
19
#include "simodo/loom/Loom.h"
20
#include "simodo/module/ModuleManagement.h"
21
#include "simodo/interpret/InterpretFactory.h"
22
#include "simodo/inout/convert/functions.h"
23
#include "simodo/LibVersion.h"
27
#if __cplusplus >= __cpp_2017
29
namespace fs = std::filesystem;
31
#include <experimental/filesystem>
32
namespace fs = std::filesystem::experimental;
35
using namespace simodo;
37
static const std::string DIGITS = "0123456789";
39
int main(int argc, char *argv[])
41
std::vector<std::string> arguments(argv + 1, argv + argc);
43
std::string file_name = "";
44
std::string simodo_root_path = ".";
45
std::vector<std::string> preload_module_names;
46
bool need_time_intervals = false;
50
bool need_silence = false;
51
std::string type_string = "";
52
std::string initial_contracts_file = engine::INITIAL_CONTRACTS_FILE;
54
for(size_t i=0; i < arguments.size(); ++i)
56
const std::string & arg = arguments[i];
60
if (arg == "--help" || arg == "-h")
62
else if (arg == "--version" || arg == "-v")
64
else if (arg == "--type" || arg == "-p")
66
if (i == arguments.size()-1 || !type_string.empty())
69
type_string = arguments[++i];
71
else if (arg == "--simodo-dir" || arg == "-s")
73
if (i == arguments.size()-1)
76
simodo_root_path = arguments[++i];
78
else if (arg == "--preload-module" || arg == "-m")
80
if (i == arguments.size()-1)
83
preload_module_names.push_back(arguments[++i]);
85
else if (arg == "--initial-contracts-file" || arg == "-c")
87
if (i == arguments.size()-1)
90
initial_contracts_file = arguments[++i];
92
else if (arg == "--time-intervals" || arg == "-t")
93
need_time_intervals = true;
94
else if (arg == "--silence" || arg == "-S")
99
else if (file_name.empty())
105
interpret::InterpretType interpret_type = interpret::InterpretType::Preview;
107
if (type_string == "analyze" || type_string == "a")
108
interpret_type = interpret::InterpretType::Analyzer;
109
else if (type_string == "preview" || type_string == "v")
110
interpret_type = interpret::InterpretType::Preview;
111
else if (!type_string.empty()) {
112
std::cout << "Задан недопустимый тип интерпретации" << std::endl;
116
if (file_name.empty() && !version && !help)
120
std::cout << "Ошибка в параметрах запуска" << std::endl;
124
const std::string logo = "Утилита интерпретации. Проект SIMODO.";
131
<< "Формат запуска:" << endl
132
<< " simodo-interpret [<параметры>] <файл>" << endl
133
<< "Параметры:" << endl
134
<< " -h | --help - отображение подсказки по запуску программы" << endl
135
<< " -v | --version - отображение версии программы" << endl
136
<< " -p | --type {a|v|analyze|preview} - тип интерпретации (по умолчанию: run)" << endl
137
<< " -s | --simodo-dir <путь> - путь к папке установки simodo" << endl
138
<< " -c | --initial-contracts-file <путь> - путь к файлу обязательных контрактов" << endl
139
<< " (по умолчанию: initial-contracts.simodo-script)," << endl
140
<< " должен находиться в каталоге: data/grammar/contracts" << endl
141
<< " -m | --preload-module <имя> - имя модуля для предварительно загрузки (можно указать несколько раз)" << endl
142
<< " -t | --time-intervals - отображать интервалы времени разбора" << endl
143
<< " -S | --silence - не выводить диагностику утилиты" << endl
151
std::cout << logo << std::endl
152
<< "Версия: " << lib_version().major() << "." << lib_version().minor() << std::endl;
154
if (file_name.empty())
157
if (!initial_contracts_file.empty()) {
158
fs::path initial_contracts_path = fs::path(simodo_root_path)
159
/ fs::path(engine::INITIAL_CONTRACTS_DIR)
160
/ initial_contracts_file;
161
initial_contracts_file = initial_contracts_path.string();
164
inout::ConsoleReporter r;
165
inout::RegularInputStreamSupplier file_supplier;
166
interpret::SemanticDataCollector_null semantic_data;
168
interpret::InterpretFactory interpret_factory(
173
module::ModuleManagement mm( r,
176
// hard_module_places,
182
engine::FrameBody engine(
185
preload_module_names,
186
initial_contracts_file,
190
bool ok = engine.prepare();
193
std::cout << "Не удалось завести движок" << std::endl;
197
auto start_of_interpret = std::chrono::high_resolution_clock::now();
199
loom::FiberStatus status = engine.run();
201
if (status != loom::FiberStatus::Complete || engine.causer()) {
203
std::cout << "Интерпретация прервана" << std::endl;
210
if (need_time_intervals) {
211
auto elapsed = std::chrono::duration<float>(std::chrono::high_resolution_clock::now() - start_of_interpret);
213
std::cout << "Интерпретация выполнена за " << elapsed.count() << " с" << std::endl;
215
else if (!need_silence)
216
std::cout << "Интерпретация выполнена успешно" << std::endl;