From a4dbf3d1957c7bd6cfde28290b6649ba5d3bd126 Mon Sep 17 00:00:00 2001 From: Robin Jadoul Date: Thu, 26 May 2016 17:13:20 +0200 Subject: [PATCH] Compress the tables in c++ backend, fixes #2 --- src/backends/cpp.cpp | 33 +++++++++++++++++++++++++++------ src/main.cpp | 1 + 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backends/cpp.cpp b/src/backends/cpp.cpp index d592d70..8d194ac 100644 --- a/src/backends/cpp.cpp +++ b/src/backends/cpp.cpp @@ -117,12 +117,33 @@ namespace lxs { namespace backends { return templ::make_array(tokenList); } - std::pair, int> CppBackend::buildTransitionIndices(const DFA& /* dfa */) const { - //FIXME: this is not really optimal ;-) - std::vector transition_idx; - for (int i = 0; i < 256; i++) - transition_idx.push_back(i); - return std::make_pair(transition_idx, 256); + std::pair, int> CppBackend::buildTransitionIndices(const DFA& dfa) const { + std::vector transition_idx(256); + int count = 0; + for (int i = 0; i < 256; i++) { + int found = i; + for (int j = 0; j < i; j++) { + bool differ = false; + for (State s = 0; s < dfa.numStates; s++) { + if (dfa.delta.find(s)->second.find(i)->second != dfa.delta.find(s)->second.find(j)->second) { + differ = true; + break; + } + } + if (!differ) { + found = j; + break; + } + } + if (found != i) + { + transition_idx[i] = transition_idx[found]; + } else { + transition_idx[i] = count++; + } + } + + return std::make_pair(transition_idx, count); } templ::TemplateContext CppBackend::transformTransitionIndices(const std::vector& transition_indices) const { diff --git a/src/main.cpp b/src/main.cpp index 458aa53..0e0c834 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,6 +30,7 @@ int main(int argc, char** argv) { } 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