ENFA merge implemented
This commit is contained in:
parent
ee6e2f1bae
commit
2bff76aac6
|
@ -1,5 +1,6 @@
|
||||||
#include "Lexesis/automata.h"
|
#include "Lexesis/automata.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
|
@ -380,5 +381,47 @@ namespace lxs {
|
||||||
|
|
||||||
return result;
|
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
|
} //namespace lxs
|
||||||
|
|
Loading…
Reference in New Issue