diff --git a/src/automata.cpp b/src/automata.cpp index 57a08e5..c55ee61 100644 --- a/src/automata.cpp +++ b/src/automata.cpp @@ -1,5 +1,6 @@ #include "Lexesis/automata.h" +#include #include #include #include @@ -380,5 +381,47 @@ namespace lxs { return result; } + + + ENFA merge(const std::vector& 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 > temptransition; + for(auto &trans: transition.second) { + std::set 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 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