From 3024de07bf51d89e2893925c354002c02f7879c8 Mon Sep 17 00:00:00 2001 From: Robin Jadoul Date: Thu, 26 May 2016 16:05:15 +0200 Subject: [PATCH] Main runner --- include/Lexesis/backendmanager.h | 4 +-- include/Lexesis/backends/cpp.h | 7 +++-- src/main.cpp | 50 ++++++++++++++++++++++++++------ 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/include/Lexesis/backendmanager.h b/include/Lexesis/backendmanager.h index 5821c86..73c993d 100644 --- a/include/Lexesis/backendmanager.h +++ b/include/Lexesis/backendmanager.h @@ -6,9 +6,9 @@ #include #include -namespace lxs { - class Backend; +#include "Lexesis/backend.h" +namespace lxs { class BackendManager { public: void registerBackend(std::unique_ptr backend); diff --git a/include/Lexesis/backends/cpp.h b/include/Lexesis/backends/cpp.h index f6ddc63..b7a15c1 100644 --- a/include/Lexesis/backends/cpp.h +++ b/include/Lexesis/backends/cpp.h @@ -13,15 +13,16 @@ namespace backends CppBackend(); virtual ~CppBackend(); + virtual std::string getName(); virtual bool canProcessLang(std::string lang); virtual void generateLexer(std::function(std::string)> getOstreamForFileName, std::string lexerName, const DFA& dfa); private: - templ::TemplateContext buildTable(const DFA& dfa, const std::vector& transition_idx, int num_transitions_per_state) const; + templ::TemplateContext buildTable(const DFA& dfa, const std::vector& transition_idx, int num_transitions_per_state) const; templ::TemplateContext buildTokenList(const DFA& dfa) const; - std::pair, int> buildTransitionIndices(const DFA& dfa) const; - templ::TemplateContext transformTransitionIndices(std::vector transition_indices) const; + std::pair, int> buildTransitionIndices(const DFA& dfa) const; + templ::TemplateContext transformTransitionIndices(const std::vector& transition_indices) const; }; } diff --git a/src/main.cpp b/src/main.cpp index 257902e..458aa53 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,13 +1,45 @@ -#include "Lexesis/automata.h" -#include "Lexesis/re.h" +#include "Lexesis/backendmanager.h" +#include "Lexesis/backends/cpp.h" +#include "Lexesis/driver.h" +#include "OptionParser.h" + +#include #include -int main() { - lxs::ENFA enfa; - std::shared_ptr re = lxs::parseRE("[]-a-dA-D]"); - re->toENFA(enfa, 0); - enfa.numStates++; - enfa.starting = 0; - std::cout << lxs::toDot(enfa) << std::endl; +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"]; + 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(); }