Parsodus/src/main.cpp

79 lines
3.0 KiB
C++

#include <iostream>
#include <fstream>
#include <vector>
#include "optparse.h"
#include "Parsodus/inputparser.h"
#include "Parsodus/backendmanager.h"
#include "Parsodus/backends/cppLR.h"
#include "Parsodus/driver.h"
int main(int argc, char** argv) {
/* Set and parse command line arguments */
optparse::OptionParser parser = optparse::OptionParser().description("Parsodus").usage("Parsodus [-d <outputdir>] [-l <language>] [-n <parsername>] [--debug] <inputfile.pds>");
parser.add_help_option(true);
parser.version("%prog 1.0");
parser.add_option("-d", "--outputdir").dest("outputdir").help("Output the generated files to this directory\n[default: .]").metavar("<directory>").set_default(".");
parser.add_option("-l", "--lang", "--language").dest("language").help("The programming language to generate source files for\n[default: c++]").metavar("<language>").set_default("c++");
parser.add_option("-n", "--name").dest("parsername").help("Use this name for the generated parser, the default is based on the input file name").metavar("<parsername>");
parser.add_option("--debug").dest("debug").action("store_true").set_default(false).help("Output debug logging");
optparse::Values options = parser.parse_args(argc, argv);
std::vector<std::string> args = parser.args();
/* Check whether a parsodus config file is given */
if (args.size() != 1) {
parser.print_usage(std::cerr);
return 1;
}
/* Open parsodus config file, if possible */
std::ifstream infile(args[0]);
if (!infile.good()) {
std::cerr << "Could not open file '" << args[0] << "' for reading" << std::endl;
return 1;
}
#ifdef _WIN32
const char PATHSEP = '\\';
#else
const char PATHSEP = '/';
#endif
std::string parsername = options["parsername"];
/* Set name of parser, if unset */
if (parsername.empty()) {
if (args[0].size() >= 4 && args[0].substr(args[0].size() - 4,4) == ".pds")
parsername = args[0].substr(0, args[0].length() - 4);
else
parsername = args[0];
std::size_t pos;
// '/' can be used on most platforms (even windows)
pos = parsername.find_last_of('/');
if (pos != parsername.npos) {
parsername = parsername.substr(pos + 1);
}
// strip platform specific as well
pos = parsername.find_last_of(PATHSEP);
if (pos != parsername.npos) {
parsername = parsername.substr(pos + 1);
}
}
auto backendManager = std::make_unique<pds::BackendManager>(pds::BackendManager());
/* Register languages */
backendManager->registerLR<pds::backends::CppLRBackend>();
/* Create parserfile, if possible */
try {
pds::Driver driver(std::move(backendManager), infile, options["outputdir"], options["language"], parsername, options.get("debug"));
return driver.run();
} catch (std::exception &err) {
std::cout << err.what() << std::endl;
return 1;
}
}