#include #include #include #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 ] [-l ] [-n ] [--debug] "); 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("").set_default("."); parser.add_option("-l", "--lang", "--language").dest("language").help("The programming language to generate source files for\n[default: c++]").metavar("").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(""); 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 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()); /* Register languages */ backendManager->registerLR(); /* 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; } }