diff --git a/alib2/src/automaton/AutomatonToXMLComposer.cpp b/alib2/src/automaton/AutomatonToXMLComposer.cpp index f4ea9fe7b00a80dbba73cdbbc5d290b4bdbdb689..ddbda3d42b587b86e0d3e0db9cfd0a2394c75deb 100644 --- a/alib2/src/automaton/AutomatonToXMLComposer.cpp +++ b/alib2/src/automaton/AutomatonToXMLComposer.cpp @@ -168,6 +168,95 @@ void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, cons out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); } +void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const CompactNFA& automaton) const { + out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& targetState: transition.second) { + out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); + + composeTransitionFrom(out, transition.first.first); + composeTransitionInputString(out, transition.first.second); + composeTransitionTo(out, targetState); + + out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); + } + } + + out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); +} + +void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const ExtendedNFA& automaton) const { + out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& targetState: transition.second) { + out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); + + composeTransitionFrom(out, transition.first.first); + composeTransitionInputRegexp(out, transition.first.second); + composeTransitionTo(out, targetState); + + out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); + } + } + + out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); +} + +void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const NPDA& automaton) const { + out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& target: transition.second) { + out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); + + composeTransitionFrom(out, std::get<0>(transition.first)); + composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + composeTransitionPop(out, std::get<2>(transition.first)); + composeTransitionTo(out, target.first); + composeTransitionPush(out, target.second); + + out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); + } + } + + out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); +} + +void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const SinglePopNPDA& automaton) const { + out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& target: transition.second) { + out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); + + composeTransitionFrom(out, std::get<0>(transition.first)); + composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + composeTransitionSinglePop(out, std::get<2>(transition.first)); + composeTransitionTo(out, target.first); + composeTransitionPush(out, target.second); + + out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); + } + } + + out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); +} + +void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const OneTapeDTM& automaton) const { + out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); + for(const auto& transition : automaton.getTransitions()) { + out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); + + composeTransitionFrom(out, transition.first.first); + composeTransitionInputSymbol(out, transition.first.second); + composeTransitionTo(out, std::get<0>(transition.second)); + composeTransitionOutputSymbol(out, std::get<1>(transition.second)); + composeTransitionShift(out, std::get<2>(transition.second)); + + out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); + } + + out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); +} + void AutomatonToXMLComposer::composeTransitionTo(std::list<sax::Token>& out, const State& state) const { out.push_back(sax::Token("to", sax::Token::TokenType::START_ELEMENT)); out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName())); @@ -194,6 +283,12 @@ void AutomatonToXMLComposer::composeTransitionPop(std::list<sax::Token>& out, co out.push_back(sax::Token("pop", sax::Token::TokenType::END_ELEMENT)); } +void AutomatonToXMLComposer::composeTransitionSinglePop(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { + out.push_back(sax::Token("pop", sax::Token::TokenType::START_ELEMENT)); + out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.push_back(sax::Token("pop", sax::Token::TokenType::END_ELEMENT)); +} + void AutomatonToXMLComposer::composeTransitionPush(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("push", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { @@ -236,6 +331,18 @@ void AutomatonToXMLComposer::composeTransitionOutputEpsilonSymbol(std::list<sax: out.push_back(sax::Token("output", sax::Token::TokenType::END_ELEMENT)); } +void AutomatonToXMLComposer::composeTransitionInputString(std::list<sax::Token>& out, const string::String& string) const { + out.push_back(sax::Token("input", sax::Token::TokenType::START_ELEMENT)); + out.splice(out.end(), alib::ToXMLComposers::stringComposer.compose(string)); + out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT)); +} + +void AutomatonToXMLComposer::composeTransitionInputRegexp(std::list<sax::Token>& out, const regexp::RegExp& regexp) const { + out.push_back(sax::Token("input", sax::Token::TokenType::START_ELEMENT)); + out.splice(out.end(), alib::ToXMLComposers::regexpComposer.compose(regexp)); + out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT)); +} + std::list<sax::Token> AutomatonToXMLComposer::compose(const AutomatonBase& automaton) const { std::list<sax::Token> out; automaton.Accept((void*) &out, *this); @@ -321,26 +428,77 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automato std::list<sax::Token> AutomatonToXMLComposer::compose(const ExtendedNFA& automaton) const { std::list<sax::Token> out; + out.push_back(sax::Token("ExtendedNFA", sax::Token::TokenType::START_ELEMENT)); + + composeStates(out, automaton.getStates()); + composeInputAlphabet(out, automaton.getInputAlphabet()); + composeInitialStates(out, automaton.getInitialStates()); + composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton); + + out.push_back(sax::Token("ExtendedNFA", sax::Token::TokenType::END_ELEMENT)); return out; } std::list<sax::Token> AutomatonToXMLComposer::compose(const CompactNFA& automaton) const { std::list<sax::Token> out; + out.push_back(sax::Token("CompactNFA", sax::Token::TokenType::START_ELEMENT)); + + composeStates(out, automaton.getStates()); + composeInputAlphabet(out, automaton.getInputAlphabet()); + composeInitialStates(out, automaton.getInitialStates()); + composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton); + + out.push_back(sax::Token("CompactNFA", sax::Token::TokenType::END_ELEMENT)); return out; } std::list<sax::Token> AutomatonToXMLComposer::compose(const NPDA& automaton) const { std::list<sax::Token> out; + out.push_back(sax::Token("NPDA", sax::Token::TokenType::START_ELEMENT)); + + composeStates(out, automaton.getStates()); + composeInputAlphabet(out, automaton.getInputAlphabet()); + composeStackAlphabet(out, automaton.getStackAlphabet()); + composeInitialStates(out, automaton.getInitialStates()); + composeFinalStates(out, automaton.getFinalStates()); + composeInitialStackSymbols(out, automaton.getInitialSymbols()); + composeTransitions(out, automaton); + + out.push_back(sax::Token("NPDA", sax::Token::TokenType::END_ELEMENT)); return out; } std::list<sax::Token> AutomatonToXMLComposer::compose(const SinglePopNPDA& automaton) const { std::list<sax::Token> out; + out.push_back(sax::Token("SinglePopNPDA", sax::Token::TokenType::START_ELEMENT)); + + composeStates(out, automaton.getStates()); + composeInputAlphabet(out, automaton.getInputAlphabet()); + composeStackAlphabet(out, automaton.getStackAlphabet()); + composeInitialStates(out, automaton.getInitialStates()); + composeFinalStates(out, automaton.getFinalStates()); + composeInitialStackSymbols(out, automaton.getInitialSymbols()); + composeTransitions(out, automaton); + + out.push_back(sax::Token("SinglePopNPDA", sax::Token::TokenType::END_ELEMENT)); return out; } std::list<sax::Token> AutomatonToXMLComposer::compose(const OneTapeDTM& automaton) const { std::list<sax::Token> out; + out.push_back(sax::Token("OneTapeDTM", sax::Token::TokenType::START_ELEMENT)); + + composeStates(out, automaton.getStates()); + composeInputAlphabet(out, automaton.getInputAlphabet()); + composeTapeAlphabet(out, automaton.getTapeAlphabet()); + composeBlankSymbol(out, automaton.getBlankSymbol()); + composeInitialState(out, automaton.getInitialState()); + composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton); + + out.push_back(sax::Token("OneTapeDTM", sax::Token::TokenType::END_ELEMENT)); return out; } diff --git a/alib2/src/automaton/AutomatonToXMLComposer.h b/alib2/src/automaton/AutomatonToXMLComposer.h index 6eebcea11b7e1206636c3081ed68df89cba53015..a9d328cdb3b5a8a0593213275328724d841fcec3 100644 --- a/alib2/src/automaton/AutomatonToXMLComposer.h +++ b/alib2/src/automaton/AutomatonToXMLComposer.h @@ -53,18 +53,26 @@ protected: void composeTransitions(std::list<sax::Token>&, const UnknownAutomaton& automaton) const; void composeTransitions(std::list<sax::Token>&, const EpsilonNFA& automaton) const; + void composeTransitions(std::list<sax::Token>&, const CompactNFA& automaton) const; + void composeTransitions(std::list<sax::Token>&, const ExtendedNFA& automaton) const; void composeTransitions(std::list<sax::Token>&, const NFA& automaton) const; void composeTransitions(std::list<sax::Token>&, const DFA& automaton) const; + void composeTransitions(std::list<sax::Token>&, const NPDA& automaton) const; + void composeTransitions(std::list<sax::Token>&, const SinglePopNPDA& automaton) const; + void composeTransitions(std::list<sax::Token>&, const OneTapeDTM& automaton) const; void composeTransitionTo(std::list<sax::Token>&, const State& state) const; void composeTransitionFrom(std::list<sax::Token>&, const State& state) const; void composeTransitionShift(std::list<sax::Token>&, const Shift shift) const; void composeTransitionPop(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols) const; + void composeTransitionSinglePop(std::list<sax::Token>&, const alphabet::Symbol& symbol) const; void composeTransitionPush(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols) const; void composeTransitionInputSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol) const; void composeTransitionInputEpsilonSymbol(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&) const; void composeTransitionOutputSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol) const; void composeTransitionOutputEpsilonSymbol(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&) const; + void composeTransitionInputString(std::list<sax::Token>&, const string::String& string) const; + void composeTransitionInputRegexp(std::list<sax::Token>&, const regexp::RegExp& regexp) const; public: /**