From ae28ed1c65d3eac6e3374e709e9ffb69ca539a8f Mon Sep 17 00:00:00 2001 From: Robin Jadoul Date: Tue, 24 May 2016 11:47:31 +0200 Subject: [PATCH] Add beginning implementation of backends --- include/Lexesis/backend.h | 31 +++++++++++++++++++++++++++++++ include/Lexesis/backendmanager.h | 23 +++++++++++++++++++++++ include/Lexesis/template.h | 30 ++++++++++++++++++++++++++++++ src/backend.cpp | 23 +++++++++++++++++++++++ src/config.h.in | 6 ++++++ src/template.cpp | 14 ++++++++++++++ 6 files changed, 127 insertions(+) create mode 100644 include/Lexesis/backend.h create mode 100644 include/Lexesis/backendmanager.h create mode 100644 include/Lexesis/template.h create mode 100644 src/backend.cpp create mode 100644 src/config.h.in create mode 100644 src/template.cpp diff --git a/include/Lexesis/backend.h b/include/Lexesis/backend.h new file mode 100644 index 0000000..cecc5fe --- /dev/null +++ b/include/Lexesis/backend.h @@ -0,0 +1,31 @@ +#pragma once +#ifndef LEXESIS_BACKEND_H +#define LEXESIS_BACKEND_H + +#include "Lexesis/automata.h" +#include "Lexesis/template.h" + +#include +#include + +namespace lxs { + class Backend { + public: + Backend(); + virtual ~Backend(); + + virtual std::string getName() = 0; + virtual bool canProcessLang(std::string lang); + + virtual void generateLexer(std::function getOstreamForFileName, std::string lexerName, const DFA& dfa) = 0; + + protected: + void doTemplate(std::ostream& out, std::string templateName, templ::TemplateContext context); + + private: + std::string findTemplate(std::string templateName); + }; +} + +#endif //LEXESIS_BACKEND_H + diff --git a/include/Lexesis/backendmanager.h b/include/Lexesis/backendmanager.h new file mode 100644 index 0000000..5821c86 --- /dev/null +++ b/include/Lexesis/backendmanager.h @@ -0,0 +1,23 @@ +#pragma once +#ifndef LEXESIS_BACKENDMANAGER_H +#define LEXESIS_BACKENDMANAGER_H + +#include +#include +#include + +namespace lxs { + class Backend; + + class BackendManager { + public: + void registerBackend(std::unique_ptr backend); + + Backend* findBackendForLang(std::string lang); + + private: + std::vector > m_backends; + }; +} + +#endif //LEXESIS_BACKENDMANAGER_H diff --git a/include/Lexesis/template.h b/include/Lexesis/template.h new file mode 100644 index 0000000..5f59c83 --- /dev/null +++ b/include/Lexesis/template.h @@ -0,0 +1,30 @@ +#pragma once +#ifndef LEXESIS_TEMPLATE_H +#define LEXESIS_TEMPLATE_H + +#include +#include +#include + +namespace lxs { +namespace templ { + using TemplateContext = void*; + + TemplateContext make_string(std::string); + TemplateContext make_map(std::map); + TemplateContext make_array(std::vector); + + class Template { + public: + Template(std::string filename); + ~Template(); + + void render(std::ostream& out, TemplateContext& context); + private: + std::string m_filename; + }; + +} //namespace templ +} //namespace lxs + +#endif //LEXESIS_TEMPLATE_H diff --git a/src/backend.cpp b/src/backend.cpp new file mode 100644 index 0000000..bb6aad8 --- /dev/null +++ b/src/backend.cpp @@ -0,0 +1,23 @@ +#include "Lexesis/backend.h" +#include "config.h" + +namespace lxs { + Backend::Backend() + {} + + Backend::~Backend() + {} + + bool Backend::canProcessLang(std::string /*lang*/) { + return false; + } + + void Backend::doTemplate(std::ostream& out, std::string templateName, templ::TemplateContext context) { + templ::Template tpl(findTemplate(templateName)); + tpl.render(out, context); + } + + std::string Backend::findTemplate(std::string templateName) { + return DATADIR "templates/" + templateName; + } +} diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 0000000..561aa3e --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,6 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#define DATADIR "@CMAKE_INSTALL_PREFIX@/share/Lexesis/" + +#endif //CONFIG_H diff --git a/src/template.cpp b/src/template.cpp new file mode 100644 index 0000000..42bfe39 --- /dev/null +++ b/src/template.cpp @@ -0,0 +1,14 @@ +#include "Lexesis/template.h" + +namespace lxs { +namespace templ { + Template::Template(std::string filename) : m_filename(filename) + {} + + Template::~Template() + {} + + void Template::render(std::ostream&, TemplateContext&) + {} +} +}