ENFA merge implemented

This commit is contained in:
Thomas Ave 2016-05-23 21:05:34 +02:00
parent ee6e2f1bae
commit 2bff76aac6
1 changed files with 43 additions and 0 deletions

View File

@ -1,5 +1,6 @@
#include "Lexesis/automata.h"
#include <iostream>
#include <cassert>
#include <algorithm>
#include <climits>
@ -380,5 +381,47 @@ namespace lxs {
return result;
}
ENFA merge(const std::vector<ENFA>& enfas) {
ENFA result;
unsigned int offset = 1;
result.starting = 0;
result.numStates = 1;
for(const auto &enfa: enfas) {
result.numStates += enfa.numStates;
for(const auto accepting: enfa.accepting) {
result.accepting.insert(accepting + offset);
}
for(const auto &priority: enfa.priority) {
result.priority[priority.first + offset] = priority.second;
}
for(const auto &acceptingToken: enfa.acceptingToken) {
result.acceptingToken[acceptingToken.first + offset] = acceptingToken.second;
}
for(const auto &transition: enfa.delta) {
std::map<char, std::set<State> > temptransition;
for(auto &trans: transition.second) {
std::set<State> tempset;
for(auto state: trans.second) {
tempset.insert(state+offset);
}
temptransition[trans.first] = tempset;
}
result.delta[transition.first + offset] = temptransition;
}
for(const auto &epsilonTransition: enfa.epsilonTransitions) {
std::set<State> tempset;
for(State state: epsilonTransition.second) {
tempset.insert(state+offset);
}
result.epsilonTransitions[epsilonTransition.first + offset] = tempset;
}
result.epsilonTransitions[0].insert(enfa.starting + offset);
offset += enfa.numStates;
}
return result;
}
} //namespace lxs