ENFA merge implemented
This commit is contained in:
parent
ee6e2f1bae
commit
2bff76aac6
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue