Compress the tables in c++ backend, fixes #2
This commit is contained in:
parent
1e460a94bd
commit
a4dbf3d195
|
@ -117,12 +117,33 @@ namespace lxs { namespace backends {
|
||||||
return templ::make_array(tokenList);
|
return templ::make_array(tokenList);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<std::vector<unsigned char>, int> CppBackend::buildTransitionIndices(const DFA& /* dfa */) const {
|
std::pair<std::vector<unsigned char>, int> CppBackend::buildTransitionIndices(const DFA& dfa) const {
|
||||||
//FIXME: this is not really optimal ;-)
|
std::vector<unsigned char> transition_idx(256);
|
||||||
std::vector<unsigned char> transition_idx;
|
int count = 0;
|
||||||
for (int i = 0; i < 256; i++)
|
for (int i = 0; i < 256; i++) {
|
||||||
transition_idx.push_back(i);
|
int found = i;
|
||||||
return std::make_pair(transition_idx, 256);
|
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<unsigned char>& transition_indices) const {
|
templ::TemplateContext CppBackend::transformTransitionIndices(const std::vector<unsigned char>& transition_indices) const {
|
||||||
|
|
|
@ -30,6 +30,7 @@ int main(int argc, char** argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string lexername = options["lexername"];
|
std::string lexername = options["lexername"];
|
||||||
|
//FIXME: this really needs some more work...
|
||||||
if (!lexername.length()) {
|
if (!lexername.length()) {
|
||||||
if (args[0].length() >= 4 && args[0].substr(args[0].length() - 4, 4) == ".lxs") {
|
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
|
lexername = args[0].substr(0, args[0].length() - 4); //Drop the .lxs
|
||||||
|
|
Loading…
Reference in New Issue