#include "Lexesis/backendmanager.h" #include "Lexesis/backends/cpp.h" #include "Lexesis/driver.h" #include "OptionParser.h" #include #include int main(int argc, char** argv) { optparse::OptionParser parser = optparse::OptionParser().description("Lexesis, the lexical analyser generator.").usage("Lexesis [-d ] [-l ] [-n ] "); 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("lexername").help("Use this name for the generated lexer, the default is based on the input file name").metavar(""); optparse::Values options = parser.parse_args(argc, argv); std::vector args = parser.args(); if (args.size() != 1) { parser.print_usage(std::cerr); return 1; } std::ifstream infile(args[0]); if (!infile.good()) { std::cerr << "Could not open file '" << args[0] << "' for reading" << std::endl; return 1; } std::string lexername = options["lexername"]; //FIXME: this really needs some more work... if (!lexername.length()) { if (args[0].length() >= 4 && args[0].substr(args[0].length() - 4, 4) == ".lxs") { lexername = args[0].substr(0, args[0].length() - 4); //Drop the .lxs } else { lexername = args[0]; } } std::unique_ptr backends(new lxs::BackendManager()); backends->registerBackend(std::unique_ptr(new lxs::backends::CppBackend())); lxs::Driver driver(std::move(backends), infile, options["outputdir"], options["language"], lexername); return driver.run(); }