79 lines
3.0 KiB
C++
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;
|
|
}
|
|
}
|