From 61227762ad25bf0e183283b9105c10529f95e650 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 15 May 2018 14:26:22 +0200 Subject: [PATCH] decouple automata and their xml api --- alib2algo/src/regexp/properties/RegExpEmpty.h | 4 +- .../src/regexp/properties/RegExpEpsilon.h | 4 +- .../automaton/convert/FTAtoPDATest.cpp | 5 + alib2data/src/automaton/AutomatonBase.h | 27 --- alib2data/src/automaton/FSM/CompactNFA.cpp | 9 - alib2data/src/automaton/FSM/CompactNFA.h | 114 +--------- alib2data/src/automaton/FSM/DFA.cpp | 9 - alib2data/src/automaton/FSM/DFA.h | 111 ---------- alib2data/src/automaton/FSM/EpsilonNFA.cpp | 9 - alib2data/src/automaton/FSM/EpsilonNFA.h | 112 ---------- alib2data/src/automaton/FSM/ExtendedNFA.cpp | 9 - alib2data/src/automaton/FSM/ExtendedNFA.h | 121 +---------- .../automaton/FSM/MultiInitialStateNFA.cpp | 9 - .../src/automaton/FSM/MultiInitialStateNFA.h | 113 ---------- alib2data/src/automaton/FSM/NFA.cpp | 9 - alib2data/src/automaton/FSM/NFA.h | 112 ---------- alib2data/src/automaton/PDA/DPDA.cpp | 10 - alib2data/src/automaton/PDA/DPDA.h | 118 ---------- .../src/automaton/PDA/InputDrivenDPDA.cpp | 10 - alib2data/src/automaton/PDA/InputDrivenDPDA.h | 116 ---------- .../src/automaton/PDA/InputDrivenNPDA.cpp | 10 - alib2data/src/automaton/PDA/InputDrivenNPDA.h | 118 ---------- alib2data/src/automaton/PDA/NPDA.cpp | 10 - alib2data/src/automaton/PDA/NPDA.h | 120 ----------- alib2data/src/automaton/PDA/NPDTA.cpp | 10 - alib2data/src/automaton/PDA/NPDTA.h | 125 ----------- .../PDA/RealTimeHeightDeterministicDPDA.cpp | 10 - .../PDA/RealTimeHeightDeterministicDPDA.h | 153 ------------- .../PDA/RealTimeHeightDeterministicNPDA.cpp | 10 - .../PDA/RealTimeHeightDeterministicNPDA.h | 160 -------------- alib2data/src/automaton/PDA/SinglePopDPDA.cpp | 10 - alib2data/src/automaton/PDA/SinglePopDPDA.h | 118 ---------- alib2data/src/automaton/PDA/SinglePopNPDA.cpp | 10 - alib2data/src/automaton/PDA/SinglePopNPDA.h | 120 ----------- .../src/automaton/PDA/VisiblyPushdownDPDA.cpp | 10 - .../src/automaton/PDA/VisiblyPushdownDPDA.h | 159 -------------- .../src/automaton/PDA/VisiblyPushdownNPDA.cpp | 10 - .../src/automaton/PDA/VisiblyPushdownNPDA.h | 166 -------------- alib2data/src/automaton/TA/DFTA.cpp | 10 - alib2data/src/automaton/TA/DFTA.h | 108 ---------- alib2data/src/automaton/TA/NFTA.cpp | 10 - alib2data/src/automaton/TA/NFTA.h | 109 ---------- alib2data/src/automaton/TM/OneTapeDTM.cpp | 11 - alib2data/src/automaton/TM/OneTapeDTM.h | 118 ---------- .../src/automaton/xml/Counter/OneCounter.h | 0 .../src/automaton/xml/Counter/TwoCounter.h | 0 .../src/automaton/xml/FSM/CompactNFA.cpp | 22 ++ alib2data/src/automaton/xml/FSM/CompactNFA.h | 148 +++++++++++++ alib2data/src/automaton/xml/FSM/DFA.cpp | 22 ++ alib2data/src/automaton/xml/FSM/DFA.h | 147 +++++++++++++ .../src/automaton/xml/FSM/EpsilonNFA.cpp | 22 ++ alib2data/src/automaton/xml/FSM/EpsilonNFA.h | 148 +++++++++++++ .../src/automaton/xml/FSM/ExtendedNFA.cpp | 22 ++ alib2data/src/automaton/xml/FSM/ExtendedNFA.h | 148 +++++++++++++ .../xml/FSM/MultiInitialStateNFA.cpp | 22 ++ .../automaton/xml/FSM/MultiInitialStateNFA.h | 149 +++++++++++++ alib2data/src/automaton/xml/FSM/NFA.cpp | 22 ++ alib2data/src/automaton/xml/FSM/NFA.h | 148 +++++++++++++ alib2data/src/automaton/xml/PDA/DPDA.cpp | 22 ++ alib2data/src/automaton/xml/PDA/DPDA.h | 154 +++++++++++++ .../src/automaton/xml/PDA/InputDrivenDPDA.cpp | 22 ++ .../src/automaton/xml/PDA/InputDrivenDPDA.h | 152 +++++++++++++ .../src/automaton/xml/PDA/InputDrivenNPDA.cpp | 22 ++ .../src/automaton/xml/PDA/InputDrivenNPDA.h | 154 +++++++++++++ alib2data/src/automaton/xml/PDA/NPDA.cpp | 22 ++ alib2data/src/automaton/xml/PDA/NPDA.h | 156 ++++++++++++++ alib2data/src/automaton/xml/PDA/NPDTA.cpp | 22 ++ alib2data/src/automaton/xml/PDA/NPDTA.h | 161 ++++++++++++++ .../PDA/RealTimeHeightDeterministicDPDA.cpp | 22 ++ .../xml/PDA/RealTimeHeightDeterministicDPDA.h | 189 ++++++++++++++++ .../PDA/RealTimeHeightDeterministicNPDA.cpp | 22 ++ .../xml/PDA/RealTimeHeightDeterministicNPDA.h | 196 +++++++++++++++++ .../src/automaton/xml/PDA/SinglePopDPDA.cpp | 22 ++ .../src/automaton/xml/PDA/SinglePopDPDA.h | 154 +++++++++++++ .../src/automaton/xml/PDA/SinglePopNPDA.cpp | 22 ++ .../src/automaton/xml/PDA/SinglePopNPDA.h | 156 ++++++++++++++ .../automaton/xml/PDA/VisiblyPushdownDPDA.cpp | 22 ++ .../automaton/xml/PDA/VisiblyPushdownDPDA.h | 195 +++++++++++++++++ .../automaton/xml/PDA/VisiblyPushdownNPDA.cpp | 22 ++ .../automaton/xml/PDA/VisiblyPushdownNPDA.h | 202 ++++++++++++++++++ alib2data/src/automaton/xml/TA/DFTA.cpp | 22 ++ alib2data/src/automaton/xml/TA/DFTA.h | 143 +++++++++++++ alib2data/src/automaton/xml/TA/NFTA.cpp | 22 ++ alib2data/src/automaton/xml/TA/NFTA.h | 145 +++++++++++++ alib2data/src/automaton/xml/TM/OneTapeDTM.cpp | 23 ++ alib2data/src/automaton/xml/TM/OneTapeDTM.h | 155 ++++++++++++++ .../{ => xml}/common/AutomatonFromXMLParser.h | 9 +- .../{ => xml}/common/AutomatonToXMLComposer.h | 7 +- .../stringology/FactorOracleAutomaton.h | 1 + .../src/indexes/stringology/SuffixAutomaton.h | 1 + .../automaton/AutomatonTemplatesTest.cpp | 1 + .../test-src/automaton/AutomatonTest.cpp | 7 + 92 files changed, 3673 insertions(+), 2720 deletions(-) create mode 100644 alib2data/src/automaton/xml/Counter/OneCounter.h create mode 100644 alib2data/src/automaton/xml/Counter/TwoCounter.h create mode 100644 alib2data/src/automaton/xml/FSM/CompactNFA.cpp create mode 100644 alib2data/src/automaton/xml/FSM/CompactNFA.h create mode 100644 alib2data/src/automaton/xml/FSM/DFA.cpp create mode 100644 alib2data/src/automaton/xml/FSM/DFA.h create mode 100644 alib2data/src/automaton/xml/FSM/EpsilonNFA.cpp create mode 100644 alib2data/src/automaton/xml/FSM/EpsilonNFA.h create mode 100644 alib2data/src/automaton/xml/FSM/ExtendedNFA.cpp create mode 100644 alib2data/src/automaton/xml/FSM/ExtendedNFA.h create mode 100644 alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.cpp create mode 100644 alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.h create mode 100644 alib2data/src/automaton/xml/FSM/NFA.cpp create mode 100644 alib2data/src/automaton/xml/FSM/NFA.h create mode 100644 alib2data/src/automaton/xml/PDA/DPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/DPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/InputDrivenDPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/InputDrivenDPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/InputDrivenNPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/InputDrivenNPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/NPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/NPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/NPDTA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/NPDTA.h create mode 100644 alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/SinglePopDPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/SinglePopDPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/SinglePopNPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/SinglePopNPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.h create mode 100644 alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.cpp create mode 100644 alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.h create mode 100644 alib2data/src/automaton/xml/TA/DFTA.cpp create mode 100644 alib2data/src/automaton/xml/TA/DFTA.h create mode 100644 alib2data/src/automaton/xml/TA/NFTA.cpp create mode 100644 alib2data/src/automaton/xml/TA/NFTA.h create mode 100644 alib2data/src/automaton/xml/TM/OneTapeDTM.cpp create mode 100644 alib2data/src/automaton/xml/TM/OneTapeDTM.h rename alib2data/src/automaton/{ => xml}/common/AutomatonFromXMLParser.h (99%) rename alib2data/src/automaton/{ => xml}/common/AutomatonToXMLComposer.h (99%) diff --git a/alib2algo/src/regexp/properties/RegExpEmpty.h b/alib2algo/src/regexp/properties/RegExpEmpty.h index 393e5a40f9..33351c4713 100644 --- a/alib2algo/src/regexp/properties/RegExpEmpty.h +++ b/alib2algo/src/regexp/properties/RegExpEmpty.h @@ -9,9 +9,9 @@ #define REG_EXP_EMPTY_H_ #include <regexp/formal/FormalRegExp.h> -#include <regexp/formal/FormalRegExpElement.h> +#include <regexp/formal/FormalRegExpElements.h> #include <regexp/unbounded/UnboundedRegExp.h> -#include <regexp/unbounded/UnboundedRegExpElement.h> +#include <regexp/unbounded/UnboundedRegExpElements.h> namespace regexp { diff --git a/alib2algo/src/regexp/properties/RegExpEpsilon.h b/alib2algo/src/regexp/properties/RegExpEpsilon.h index ca66c89127..95c26996c5 100644 --- a/alib2algo/src/regexp/properties/RegExpEpsilon.h +++ b/alib2algo/src/regexp/properties/RegExpEpsilon.h @@ -9,9 +9,9 @@ #define REG_EXP_EPSILON_H_ #include <regexp/formal/FormalRegExp.h> -#include <regexp/formal/FormalRegExpElement.h> +#include <regexp/formal/FormalRegExpElements.h> #include <regexp/unbounded/UnboundedRegExp.h> -#include <regexp/unbounded/UnboundedRegExpElement.h> +#include <regexp/unbounded/UnboundedRegExpElements.h> namespace regexp { diff --git a/alib2algo/test-src/automaton/convert/FTAtoPDATest.cpp b/alib2algo/test-src/automaton/convert/FTAtoPDATest.cpp index b162b11fe7..a576e80e52 100644 --- a/alib2algo/test-src/automaton/convert/FTAtoPDATest.cpp +++ b/alib2algo/test-src/automaton/convert/FTAtoPDATest.cpp @@ -4,6 +4,11 @@ #include <automaton/TA/DFTA.h> #include <automaton/TA/NFTA.h> +#include <automaton/PDA/DPDA.h> +#include <automaton/xml/PDA/DPDA.h> +#include <automaton/PDA/NPDA.h> +#include <automaton/xml/PDA/NPDA.h> + #include "automaton/convert/ToPostfixPushdownAutomaton.h" #include <factory/XmlDataFactory.hpp> diff --git a/alib2data/src/automaton/AutomatonBase.h b/alib2data/src/automaton/AutomatonBase.h index 9529fb02a8..78b3559939 100644 --- a/alib2data/src/automaton/AutomatonBase.h +++ b/alib2data/src/automaton/AutomatonBase.h @@ -10,8 +10,6 @@ #include <object/ObjectBase.h> -#include <core/xmlApi.hpp> - namespace automaton { /** @@ -25,29 +23,4 @@ public: } /* namespace automaton */ -namespace core { - -template < typename Type > -struct xmlApi < Type, typename std::enable_if < std::is_base_of < automaton::AutomatonBase, Type >::value >::type > { - static Type parse ( ext::deque < sax::Token >::iterator & input ) { - return Type::parse ( input ); - } - - static bool first ( const ext::deque < sax::Token >::const_iterator & input ) { - return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName() ); - } - - static std::string xmlTagName ( ) { - return Type::getXmlTagName(); - } - - static void compose ( ext::deque < sax::Token > & output, const Type & data ) { - Type::compose ( output, data ); - } - -}; - -} /* namespace core */ - #endif /* AUTOMATON_BASE_H_ */ - diff --git a/alib2data/src/automaton/FSM/CompactNFA.cpp b/alib2data/src/automaton/FSM/CompactNFA.cpp index a401602628..5c5ef48446 100644 --- a/alib2data/src/automaton/FSM/CompactNFA.cpp +++ b/alib2data/src/automaton/FSM/CompactNFA.cpp @@ -6,11 +6,8 @@ */ #include "CompactNFA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> #include <registration/ComponentRegistration.hpp> @@ -20,12 +17,6 @@ static auto components = registration::ComponentRegister < automaton::CompactNFA static auto valuePrinter = registration::ValuePrinterRegister < automaton::CompactNFA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::CompactNFA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::CompactNFA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::CompactNFA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::CompactNFA < > > ( ); - static auto compactNFAFromDFA = registration::CastRegister < automaton::CompactNFA < >, automaton::DFA < > > ( ); static auto compactNFAFromNFA = registration::CastRegister < automaton::CompactNFA < >, automaton::NFA < > > ( ); static auto compactNFAFromMultiInitialStateNFA = registration::CastRegister < automaton::CompactNFA < >, automaton::MultiInitialStateNFA < > > ( ); diff --git a/alib2data/src/automaton/FSM/CompactNFA.h b/alib2data/src/automaton/FSM/CompactNFA.h index 3724d787f4..42de0344f9 100644 --- a/alib2data/src/automaton/FSM/CompactNFA.h +++ b/alib2data/src/automaton/FSM/CompactNFA.h @@ -31,19 +31,16 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <common/createUnique.hpp> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> -#include "../../label/InitialStateLabel.h" +#include <label/InitialStateLabel.h> #include <core/normalize.hpp> @@ -422,52 +419,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "CompactNFA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static CompactNFA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, CompactNFA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const CompactNFA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const CompactNFA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -653,69 +604,6 @@ CompactNFA < SymbolType, StateType >::operator std::string ( ) const { return ss.str ( ); } -template < class SymbolType, class StateType > -CompactNFA < SymbolType, StateType > CompactNFA < SymbolType, StateType >::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, CompactNFA < SymbolType, StateType >::getXmlTagName() ); - - ext::set < StateType > states = AutomatonFromXMLParser::parseStates < StateType > ( input ); - ext::set < SymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); - StateType initialState = AutomatonFromXMLParser::parseInitialState < StateType > ( input ); - ext::set < StateType > finalStates = AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); - - CompactNFA < SymbolType, StateType > automaton ( std::move ( initialState ) ); - - automaton.setStates ( std::move ( states ) ); - automaton.setInputAlphabet ( std::move ( inputSymbols ) ); - automaton.setFinalStates ( std::move ( finalStates ) ); - - AutomatonFromXMLParser::parseTransitions < CompactNFA > ( input, automaton ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, CompactNFA < SymbolType, StateType >::getXmlTagName() ); - return automaton; -} - -template < class SymbolType, class StateType > -void CompactNFA < SymbolType, StateType >::parseTransition ( ext::deque < sax::Token >::iterator & input, CompactNFA & automaton ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); - StateType from = AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); - ext::vector < SymbolType > inputString = AutomatonFromXMLParser::parseTransitionInputSymbolMultiple < SymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); - - automaton.addTransition ( std::move ( from ), std::move ( inputString ), std::move ( to ) ); -} - -template < class SymbolType, class StateType > -void CompactNFA < SymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const CompactNFA & automaton ) { - out.emplace_back ( CompactNFA < SymbolType, StateType >::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); - AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); - AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); - AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); - composeTransitions ( out, automaton ); - - out.emplace_back ( CompactNFA < SymbolType, StateType >::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -template < class SymbolType, class StateType > -void CompactNFA < SymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const CompactNFA & automaton ) { - out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); - - for ( const auto & transition : automaton.getTransitions ( ) ) - for ( const auto & targetState : transition.second ) { - out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); - AutomatonToXMLComposer::composeTransitionInputSymbolMultiple ( out, transition.first.second ); - AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); - - out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); - } - - out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); -} - template < class SymbolType, class StateType > object::ObjectBase* CompactNFA < SymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/FSM/DFA.cpp b/alib2data/src/automaton/FSM/DFA.cpp index 7e3a84f688..f23df78b19 100644 --- a/alib2data/src/automaton/FSM/DFA.cpp +++ b/alib2data/src/automaton/FSM/DFA.cpp @@ -6,20 +6,11 @@ */ #include "DFA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::DFA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::DFA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::DFA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::DFA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::DFA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/FSM/DFA.h b/alib2data/src/automaton/FSM/DFA.h index 5e7fbe08f5..abbe2f723a 100644 --- a/alib2data/src/automaton/FSM/DFA.h +++ b/alib2data/src/automaton/FSM/DFA.h @@ -31,14 +31,11 @@ #include <alib/range> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -388,52 +385,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "DFA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static DFA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, DFA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const DFA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const DFA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -585,68 +536,6 @@ DFA<SymbolType, StateType>::operator std::string ( ) const { return ss.str ( ); } -template<class SymbolType, class StateType > -DFA<SymbolType, StateType> DFA<SymbolType, StateType>::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, DFA::getXmlTagName() ); - - ext::set < StateType > states = AutomatonFromXMLParser::parseStates < StateType > ( input ); - ext::set < SymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); - StateType initialState = AutomatonFromXMLParser::parseInitialState < StateType > ( input ); - ext::set < StateType > finalStates = AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); - - DFA<SymbolType, StateType> automaton ( std::move ( initialState ) ); - - automaton.setStates ( std::move ( states ) ); - automaton.setInputAlphabet ( std::move ( inputSymbols ) ); - automaton.setFinalStates ( std::move ( finalStates ) ); - - AutomatonFromXMLParser::parseTransitions < DFA > ( input, automaton ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, DFA::getXmlTagName() ); - return automaton; -} - -template<class SymbolType, class StateType > -void DFA<SymbolType, StateType>::parseTransition ( ext::deque < sax::Token >::iterator & input, DFA<SymbolType, StateType> & automaton ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); - StateType from = AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); - SymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol < SymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); - - automaton.addTransition ( std::move ( from ), std::move ( inputSymbol ), std::move ( to ) ); -} - -template<class SymbolType, class StateType > -void DFA<SymbolType, StateType>::compose ( ext::deque < sax::Token > & out, const DFA & automaton ) { - out.emplace_back ( DFA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); - AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); - AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); - AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); - composeTransitions ( out, automaton ); - - out.emplace_back ( DFA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -template<class SymbolType, class StateType > -void DFA<SymbolType, StateType>::composeTransitions ( ext::deque < sax::Token > & out, const DFA & automaton ) { - out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); - - for ( const auto & transition : automaton.getTransitions ( ) ) { - out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); - AutomatonToXMLComposer::composeTransitionInputSymbol ( out, transition.first.second ); - AutomatonToXMLComposer::composeTransitionTo ( out, transition.second ); - - out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); - } - - out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); -} - template < class SymbolType, class StateType > object::ObjectBase* DFA < SymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/FSM/EpsilonNFA.cpp index afbbeae205..d02a3c8dbf 100644 --- a/alib2data/src/automaton/FSM/EpsilonNFA.cpp +++ b/alib2data/src/automaton/FSM/EpsilonNFA.cpp @@ -6,23 +6,14 @@ */ #include "EpsilonNFA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::EpsilonNFA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::EpsilonNFA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::EpsilonNFA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::EpsilonNFA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::EpsilonNFA < > > ( ); - static auto epsilonNFAFromDFA = registration::CastRegister < automaton::EpsilonNFA < >, automaton::DFA < > > ( ); static auto epsilonNFAFromNFA = registration::CastRegister < automaton::EpsilonNFA < >, automaton::NFA < > > ( ); static auto epsilonNFAFromMultiInitialStateNFA = registration::CastRegister < automaton::EpsilonNFA < >, automaton::MultiInitialStateNFA < > > ( ); diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h index a836c7d7e1..f0b7e87086 100644 --- a/alib2data/src/automaton/FSM/EpsilonNFA.h +++ b/alib2data/src/automaton/FSM/EpsilonNFA.h @@ -30,7 +30,6 @@ #include <ostream> #include <sstream> -#include <sax/FromXMLParserHelper.h> #include <core/components.hpp> #include <common/createUnique.hpp> #include <object/UniqueObject.h> @@ -38,8 +37,6 @@ #include "../AutomatonException.h" #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -558,52 +555,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "EpsilonNFA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static EpsilonNFA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, EpsilonNFA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const EpsilonNFA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const EpsilonNFA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -910,69 +861,6 @@ EpsilonNFA < SymbolType, EpsilonType, StateType >::operator std::string ( ) cons return ss.str ( ); } -template<class SymbolType, class EpsilonType, class StateType > -EpsilonNFA < SymbolType, EpsilonType, StateType > EpsilonNFA < SymbolType, EpsilonType, StateType >::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, EpsilonNFA::getXmlTagName() ); - - ext::set < StateType > states = AutomatonFromXMLParser::parseStates < StateType > ( input ); - ext::set < SymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); - StateType initialState = AutomatonFromXMLParser::parseInitialState < StateType > ( input ); - ext::set < StateType > finalStates = AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); - - EpsilonNFA < SymbolType, EpsilonType, StateType > automaton ( std::move ( initialState ) ); - - automaton.setStates ( std::move ( states ) ); - automaton.setInputAlphabet ( std::move ( inputSymbols ) ); - automaton.setFinalStates ( std::move ( finalStates ) ); - - AutomatonFromXMLParser::parseTransitions < EpsilonNFA > ( input, automaton ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, EpsilonNFA::getXmlTagName() ); - return automaton; -} - -template<class SymbolType, class EpsilonType, class StateType > -void EpsilonNFA < SymbolType, EpsilonType, StateType >::parseTransition ( ext::deque < sax::Token >::iterator & input, EpsilonNFA & automaton ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); - StateType from = AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); - ext::variant < EpsilonType, SymbolType > inputVariant = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, SymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); - - automaton.addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) ); -} - -template<class SymbolType, class EpsilonType, class StateType > -void EpsilonNFA < SymbolType, EpsilonType, StateType >::compose ( ext::deque < sax::Token > & out, const EpsilonNFA & automaton ) { - out.emplace_back ( EpsilonNFA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); - AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); - AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); - AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); - composeTransitions ( out, automaton ); - - out.emplace_back ( EpsilonNFA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -template<class SymbolType, class EpsilonType, class StateType > -void EpsilonNFA < SymbolType, EpsilonType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const EpsilonNFA & automaton ) { - out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); - - for ( const auto & transition : automaton.getTransitions ( ) ) - for ( const auto & targetState : transition.second ) { - out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol ( out, transition.first.second ); - AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); - - out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); - } - - out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); -} - template < class SymbolType, class EpsilonType, class StateType > object::ObjectBase* EpsilonNFA < SymbolType, EpsilonType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.cpp b/alib2data/src/automaton/FSM/ExtendedNFA.cpp index ce8d8d3d6e..990f48493d 100644 --- a/alib2data/src/automaton/FSM/ExtendedNFA.cpp +++ b/alib2data/src/automaton/FSM/ExtendedNFA.cpp @@ -6,23 +6,14 @@ */ #include "ExtendedNFA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::ExtendedNFA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::ExtendedNFA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::ExtendedNFA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::ExtendedNFA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::ExtendedNFA < > > ( ); - static auto extendedNFAFromDFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::DFA < > > ( ); static auto extendedNFAFromNFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::NFA < > > ( ); static auto extendedNFAFromMultiInitialStateNFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::MultiInitialStateNFA < > > ( ); diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h index e1816b9471..949d630b59 100644 --- a/alib2data/src/automaton/FSM/ExtendedNFA.h +++ b/alib2data/src/automaton/FSM/ExtendedNFA.h @@ -30,8 +30,6 @@ #include <alib/algorithm> #include <sstream> -#include <sax/FromXMLParserHelper.h> -#include <regexp/xml/UnboundedRegExpStructure.h> #include <core/components.hpp> #include <common/createUnique.hpp> #include <object/UniqueObject.h> @@ -39,15 +37,13 @@ #include "../AutomatonException.h" #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> -#include "../../label/InitialStateLabel.h" -#include "../../regexp/unbounded/UnboundedRegExpStructure.h" -#include "../../regexp/unbounded/UnboundedRegExpConcatenation.h" -#include "../../regexp/unbounded/UnboundedRegExpSymbol.h" +#include <label/InitialStateLabel.h> +#include <regexp/unbounded/UnboundedRegExpStructure.h> +#include <regexp/unbounded/UnboundedRegExpConcatenation.h> +#include <regexp/unbounded/UnboundedRegExpSymbol.h> #include <core/normalize.hpp> @@ -433,52 +429,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "ExtendedNFA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static ExtendedNFA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, ExtendedNFA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const ExtendedNFA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const ExtendedNFA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -678,69 +628,6 @@ ExtendedNFA < SymbolType, StateType >::operator std::string ( ) const { return ss.str ( ); } -template<class SymbolType, class StateType > -ExtendedNFA < SymbolType, StateType > ExtendedNFA < SymbolType, StateType >::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, ExtendedNFA::getXmlTagName() ); - - ext::set < StateType > states = AutomatonFromXMLParser::parseStates < StateType > ( input ); - ext::set < SymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); - StateType initialState = AutomatonFromXMLParser::parseInitialState < StateType > ( input ); - ext::set < StateType > finalStates = AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); - - ExtendedNFA < SymbolType, StateType > automaton ( std::move ( initialState ) ); - - automaton.setStates ( std::move ( states ) ); - automaton.setInputAlphabet ( std::move ( inputSymbols ) ); - automaton.setFinalStates ( std::move ( finalStates ) ); - - AutomatonFromXMLParser::parseTransitions < ExtendedNFA > ( input, automaton ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, ExtendedNFA::getXmlTagName() ); - return automaton; -} - -template<class SymbolType, class StateType > -void ExtendedNFA < SymbolType, StateType >::parseTransition ( ext::deque < sax::Token >::iterator & input, ExtendedNFA & automaton ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); - StateType from = AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); - regexp::UnboundedRegExpStructure < SymbolType > inputRegexp = AutomatonFromXMLParser::parseTransitionInputRegexp < SymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); - - automaton.addTransition ( std::move ( from ), std::move ( inputRegexp ), std::move ( to ) ); -} - -template<class SymbolType, class StateType > -void ExtendedNFA < SymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const ExtendedNFA & automaton ) { - out.emplace_back ( ExtendedNFA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); - AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); - AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); - AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); - composeTransitions ( out, automaton ); - - out.emplace_back ( ExtendedNFA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -template<class SymbolType, class StateType > -void ExtendedNFA < SymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const ExtendedNFA & automaton ) { - out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); - - for ( const auto & transition : automaton.getTransitions ( ) ) - for ( const auto & targetState : transition.second ) { - out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); - AutomatonToXMLComposer::composeTransitionInputRegexp ( out, transition.first.second ); - AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); - - out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); - } - - out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); -} - template < class SymbolType, class StateType > object::ObjectBase* ExtendedNFA < SymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp index 8426965a0f..a1bd29f764 100644 --- a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp +++ b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp @@ -6,23 +6,14 @@ */ #include "MultiInitialStateNFA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::MultiInitialStateNFA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::MultiInitialStateNFA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::MultiInitialStateNFA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::MultiInitialStateNFA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::MultiInitialStateNFA < > > ( ); - static auto multiInitialStateNFAFromDFA = registration::CastRegister < automaton::MultiInitialStateNFA < >, automaton::DFA < > > ( ); static auto multiInitialStateNFAFromNFA = registration::CastRegister < automaton::MultiInitialStateNFA < >, automaton::NFA < > > ( ); diff --git a/alib2data/src/automaton/FSM/MultiInitialStateNFA.h b/alib2data/src/automaton/FSM/MultiInitialStateNFA.h index 92d3b3f36f..128cc9a2a9 100644 --- a/alib2data/src/automaton/FSM/MultiInitialStateNFA.h +++ b/alib2data/src/automaton/FSM/MultiInitialStateNFA.h @@ -29,15 +29,12 @@ #include <ostream> #include <sstream> -#include <sax/FromXMLParserHelper.h> #include <core/components.hpp> #include <object/UniqueObject.h> #include "../AutomatonException.h" #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -450,52 +447,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "MultiInitialStateNFA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static MultiInitialStateNFA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, MultiInitialStateNFA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const MultiInitialStateNFA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const MultiInitialStateNFA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -668,70 +619,6 @@ MultiInitialStateNFA < SymbolType, StateType >::operator std::string ( ) const { return ss.str ( ); } -template < class SymbolType, class StateType > -MultiInitialStateNFA < SymbolType, StateType > MultiInitialStateNFA < SymbolType, StateType >::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, MultiInitialStateNFA < SymbolType, StateType >::getXmlTagName() ); - - ext::set < StateType > states = AutomatonFromXMLParser::parseStates < StateType > ( input ); - ext::set < SymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); - ext::set < StateType > initialStates = AutomatonFromXMLParser::parseInitialStates < StateType > ( input ); - ext::set < StateType > finalStates = AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); - - MultiInitialStateNFA < SymbolType, StateType > automaton; - - automaton.setStates ( std::move ( states ) ); - automaton.setInputAlphabet ( std::move ( inputSymbols ) ); - automaton.setInitialStates ( std::move ( initialStates ) ); - automaton.setFinalStates ( std::move ( finalStates ) ); - - AutomatonFromXMLParser::parseTransitions < MultiInitialStateNFA > ( input, automaton ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, MultiInitialStateNFA < SymbolType, StateType >::getXmlTagName() ); - return automaton; -} - -template < class SymbolType, class StateType > -void MultiInitialStateNFA < SymbolType, StateType >::parseTransition ( ext::deque < sax::Token >::iterator & input, MultiInitialStateNFA & automaton ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); - StateType from = AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); - SymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol < SymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); - - automaton.addTransition ( std::move ( from ), std::move ( inputSymbol ), std::move ( to ) ); -} - -template < class SymbolType, class StateType > -void MultiInitialStateNFA < SymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const MultiInitialStateNFA & automaton ) { - out.emplace_back ( MultiInitialStateNFA < SymbolType, StateType >::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); - AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); - AutomatonToXMLComposer::composeInitialStates ( out, automaton.getInitialStates ( ) ); - AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); - composeTransitions ( out, automaton ); - - out.emplace_back ( MultiInitialStateNFA < SymbolType, StateType >::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -template < class SymbolType, class StateType > -void MultiInitialStateNFA < SymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const MultiInitialStateNFA & automaton ) { - out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); - - for ( const auto & transition : automaton.getTransitions ( ) ) - for ( const auto & targetState : transition.second ) { - out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); - AutomatonToXMLComposer::composeTransitionInputSymbol ( out, transition.first.second ); - AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); - - out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); - } - - out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); -} - template < class SymbolType, class StateType > object::ObjectBase* MultiInitialStateNFA < SymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/FSM/NFA.cpp b/alib2data/src/automaton/FSM/NFA.cpp index 552f2d4155..b49a674bce 100644 --- a/alib2data/src/automaton/FSM/NFA.cpp +++ b/alib2data/src/automaton/FSM/NFA.cpp @@ -6,23 +6,14 @@ */ #include "NFA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> #include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::NFA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::NFA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::NFA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NFA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NFA < > > ( ); - static auto NFAFromDFA = registration::CastRegister < automaton::NFA < >, automaton::DFA < > > ( ); } /* namespace */ diff --git a/alib2data/src/automaton/FSM/NFA.h b/alib2data/src/automaton/FSM/NFA.h index d27f4f0708..214bb826ce 100644 --- a/alib2data/src/automaton/FSM/NFA.h +++ b/alib2data/src/automaton/FSM/NFA.h @@ -28,14 +28,11 @@ #include <alib/set> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonException.h" #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -420,52 +417,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "NFA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static NFA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, NFA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const NFA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const NFA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -631,69 +582,6 @@ NFA < SymbolType, StateType >::operator std::string ( ) const { return ss.str ( ); } -template<class SymbolType, class StateType > -NFA < SymbolType, StateType > NFA < SymbolType, StateType >::parse ( ext::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, NFA < SymbolType, StateType >::getXmlTagName() ); - - ext::set < StateType > states = AutomatonFromXMLParser::parseStates < StateType > ( input ); - ext::set < SymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); - StateType initialState = AutomatonFromXMLParser::parseInitialState < StateType > ( input ); - ext::set < StateType > finalStates = AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); - - NFA < SymbolType, StateType > automaton ( std::move ( initialState ) ); - - automaton.setStates ( std::move ( states ) ); - automaton.setInputAlphabet ( std::move ( inputSymbols ) ); - automaton.setFinalStates ( std::move ( finalStates ) ); - - AutomatonFromXMLParser::parseTransitions < NFA > ( input, automaton ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, NFA < SymbolType, StateType >::getXmlTagName() ); - return automaton; -} - -template<class SymbolType, class StateType > -void NFA < SymbolType, StateType >::parseTransition ( ext::deque < sax::Token >::iterator & input, NFA & automaton ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); - StateType from = AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); - SymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol < SymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); - - automaton.addTransition ( std::move ( from ), std::move ( inputSymbol ), std::move ( to ) ); -} - -template<class SymbolType, class StateType > -void NFA < SymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const NFA & automaton ) { - out.emplace_back ( NFA < SymbolType, StateType >::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); - AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); - AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); - AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); - composeTransitions ( out, automaton ); - - out.emplace_back ( NFA < SymbolType, StateType >::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -template<class SymbolType, class StateType > -void NFA < SymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const NFA & automaton ) { - out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); - - for ( const auto & transition : automaton.getTransitions ( ) ) - for ( const auto & targetState : transition.second ) { - out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); - - AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); - AutomatonToXMLComposer::composeTransitionInputSymbol ( out, transition.first.second ); - AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); - - out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); - } - - out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); -} - template < class SymbolType, class StateType > object::ObjectBase* NFA < SymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/DPDA.cpp b/alib2data/src/automaton/PDA/DPDA.cpp index 98b4ffe027..4c889af619 100644 --- a/alib2data/src/automaton/PDA/DPDA.cpp +++ b/alib2data/src/automaton/PDA/DPDA.cpp @@ -6,21 +6,11 @@ */ #include "DPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::DPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::DPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::DPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::DPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::DPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/DPDA.h b/alib2data/src/automaton/PDA/DPDA.h index 60177fcced..56e1c86fe7 100644 --- a/alib2data/src/automaton/PDA/DPDA.h +++ b/alib2data/src/automaton/PDA/DPDA.h @@ -32,14 +32,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -550,52 +547,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "DPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static DPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, DPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const DPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const DPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -804,75 +755,6 @@ DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::opera return ss.str(); } -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, DPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType initialPushdownStoreSymbol = AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - DPDA automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<DPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, DPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, DPDA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant<EpsilonType, InputSymbolType> inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); - ext::vector<PushdownStoreSymbolType> pop = AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - ext::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const DPDA & automaton ) { - out.emplace_back(DPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions ( out, automaton ); - - out.emplace_back(DPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const DPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionPop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); - AutomatonToXMLComposer::composeTransitionPush(out, transition.second.second); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp b/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp index 4d59f970d7..ad402cec47 100644 --- a/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp +++ b/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp @@ -6,21 +6,11 @@ */ #include "InputDrivenDPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::InputDrivenDPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::InputDrivenDPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::InputDrivenDPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::InputDrivenDPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::InputDrivenDPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.h b/alib2data/src/automaton/PDA/InputDrivenDPDA.h index f87e4c7015..8dda09be0a 100644 --- a/alib2data/src/automaton/PDA/InputDrivenDPDA.h +++ b/alib2data/src/automaton/PDA/InputDrivenDPDA.h @@ -32,14 +32,11 @@ #include <alib/algorithm> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -532,52 +529,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "InputDrivenDPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static InputDrivenDPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, InputDrivenDPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const InputDrivenDPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const InputDrivenDPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -774,73 +725,6 @@ InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::operato return ss.str(); } -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, InputDrivenDPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType initialPushdownStoreSymbol = AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - automaton.setPushdownStoreOperations(AutomatonFromXMLParser::parseInputToPushdownStoreOperation<InputSymbolType, PushdownStoreSymbolType>(input)); - AutomatonFromXMLParser::parseTransitions<InputDrivenDPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, InputDrivenDPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, InputDrivenDPDA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(to)); -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const InputDrivenDPDA & automaton ) { - out.emplace_back(InputDrivenDPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - AutomatonToXMLComposer::composeInputToPushdownStoreOperation(out, automaton.getPushdownStoreOperations()); - composeTransitions ( out, automaton ); - - out.emplace_back(InputDrivenDPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const InputDrivenDPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp b/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp index 7a20b116f1..de4e7ee049 100644 --- a/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp +++ b/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp @@ -6,21 +6,11 @@ */ #include "InputDrivenNPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::InputDrivenNPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::InputDrivenNPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::InputDrivenNPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::InputDrivenNPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::InputDrivenNPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/InputDrivenNPDA.h b/alib2data/src/automaton/PDA/InputDrivenNPDA.h index 62931c5b42..2c2935e218 100644 --- a/alib2data/src/automaton/PDA/InputDrivenNPDA.h +++ b/alib2data/src/automaton/PDA/InputDrivenNPDA.h @@ -32,14 +32,11 @@ #include <alib/algorithm> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -557,52 +554,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "InputDrivenNPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static InputDrivenNPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, InputDrivenNPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const InputDrivenNPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const InputDrivenNPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -813,75 +764,6 @@ InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::operato return ss.str(); } -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, InputDrivenNPDA::getXmlTagName()); - - ext::set<StateType > states = AutomatonFromXMLParser::parseStates<StateType >(input); - ext::set<InputSymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType >(input); - PushdownStoreSymbolType initialPushdownStoreSymbol = AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType > finalStates = AutomatonFromXMLParser::parseFinalStates<StateType >(input); - - InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - automaton.setPushdownStoreOperations(AutomatonFromXMLParser::parseInputToPushdownStoreOperation<InputSymbolType, PushdownStoreSymbolType>(input)); - AutomatonFromXMLParser::parseTransitions<InputDrivenNPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, InputDrivenNPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, InputDrivenNPDA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType >(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType >(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(to)); -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const InputDrivenNPDA & automaton ) { - out.emplace_back(InputDrivenNPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - AutomatonToXMLComposer::composeInputToPushdownStoreOperation(out, automaton.getPushdownStoreOperations()); - composeTransitions ( out, automaton ); - - out.emplace_back(InputDrivenNPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const InputDrivenNPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, target); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/NPDA.cpp b/alib2data/src/automaton/PDA/NPDA.cpp index 5fd9304bf3..9ecf921bc3 100644 --- a/alib2data/src/automaton/PDA/NPDA.cpp +++ b/alib2data/src/automaton/PDA/NPDA.cpp @@ -6,21 +6,11 @@ */ #include "NPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::NPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::NPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::NPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/NPDA.h b/alib2data/src/automaton/PDA/NPDA.h index bcb52dbbb6..46fa9ac047 100644 --- a/alib2data/src/automaton/PDA/NPDA.h +++ b/alib2data/src/automaton/PDA/NPDA.h @@ -32,14 +32,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -566,52 +563,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "NPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static NPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, NPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const NPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & ou, const NPDA & automatont ); - /** * @copydoc object::ObjectBase::inc() */ @@ -770,77 +721,6 @@ NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::opera return ss.str(); } -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, NPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set < InputSymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < InputSymbolType > ( input ); - ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType initialPushdownStoreSymbol = AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - NPDA automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<NPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, NPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, NPDA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, InputSymbolType > ( input ); - ext::vector<PushdownStoreSymbolType> pop = AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - ext::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const NPDA & automaton ) { - out.emplace_back(NPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions ( out, automaton ); - - out.emplace_back(NPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const NPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionPop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, target.first); - AutomatonToXMLComposer::composeTransitionPush(out, target.second); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/NPDTA.cpp b/alib2data/src/automaton/PDA/NPDTA.cpp index 9b70c87c10..48316e7b5e 100644 --- a/alib2data/src/automaton/PDA/NPDTA.cpp +++ b/alib2data/src/automaton/PDA/NPDTA.cpp @@ -6,21 +6,11 @@ */ #include "NPDTA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::NPDTA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::NPDTA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::NPDTA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NPDTA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NPDTA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/NPDTA.h b/alib2data/src/automaton/PDA/NPDTA.h index e2310f67bf..aeea0944f1 100644 --- a/alib2data/src/automaton/PDA/NPDTA.h +++ b/alib2data/src/automaton/PDA/NPDTA.h @@ -32,14 +32,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -643,52 +640,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "NPDTA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static NPDTA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, NPDTA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const NPDTA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const NPDTA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -882,82 +833,6 @@ NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, return ss.str(); } -template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, NPDTA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set < InputSymbolType > inputSymbols = AutomatonFromXMLParser::parseInputAlphabet < InputSymbolType > ( input ); - ext::set<PushdownStoreSymbolType> stackSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - ext::set < OutputSymbolType > outputSymbols = AutomatonFromXMLParser::parseOutputAlphabet < OutputSymbolType > ( input ); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType initialPushdownStoreSymbol = AutomatonFromXMLParser::parseInitialPushdownStoreSymbol < PushdownStoreSymbolType > ( input ); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); - automaton.setOutputAlphabet(std::move(outputSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<NPDTA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, NPDTA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, NPDTA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); - ext::vector<PushdownStoreSymbolType> pop = AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - ext::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); - ext::vector < OutputSymbolType > output = AutomatonFromXMLParser::parseTransitionOutputSymbolMultiple < OutputSymbolType > (input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push), std::move(output)); -} - -template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::compose(ext::deque<sax::Token>& out, const NPDTA & automaton ) { - out.emplace_back(NPDTA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeOutputAlphabet(out, automaton.getOutputAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions(out, automaton); - - out.emplace_back(NPDTA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::composeTransitions(ext::deque<sax::Token>& out, const NPDTA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionPop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, std::get<0>(target)); - AutomatonToXMLComposer::composeTransitionPush(out, std::get<1>(target)); - AutomatonToXMLComposer::composeTransitionOutputSymbolMultiple(out, std::get<2>(target)); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp index 6dcf5efc57..39cb3c0c86 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp @@ -6,21 +6,11 @@ */ #include "RealTimeHeightDeterministicDPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::RealTimeHeightDeterministicDPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::RealTimeHeightDeterministicDPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::RealTimeHeightDeterministicDPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::RealTimeHeightDeterministicDPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::RealTimeHeightDeterministicDPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h index 9c9e0cfe71..281279c062 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h @@ -32,14 +32,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -769,52 +766,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "RealTimeHeightDeterministicDPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static RealTimeHeightDeterministicDPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, RealTimeHeightDeterministicDPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const RealTimeHeightDeterministicDPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & ou, const RealTimeHeightDeterministicDPDA & automatont ); - /** * @copydoc object::ObjectBase::inc() */ @@ -1174,110 +1125,6 @@ RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSym return ss.str(); } -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, RealTimeHeightDeterministicDPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> stackSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType bottomOfTheStackSymbol = AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(bottomOfTheStackSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<RealTimeHeightDeterministicDPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, RealTimeHeightDeterministicDPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, RealTimeHeightDeterministicDPDA& automaton) { - if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - PushdownStoreSymbolType push = AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); - - automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); - } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); - PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); - } else { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); - } -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const RealTimeHeightDeterministicDPDA & automaton ) { - out.emplace_back(RealTimeHeightDeterministicDPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions ( out, automaton ); - - out.emplace_back(RealTimeHeightDeterministicDPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const RealTimeHeightDeterministicDPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getCallTransitions()) { - out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); - AutomatonToXMLComposer::composeTransitionSinglePush(out, transition.second.second); - - out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); - } - for(const auto& transition : automaton.getReturnTransitions()) { - out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second); - - out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); - } - for(const auto& transition : automaton.getLocalTransitions()) { - out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second); - - out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); - } - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp index 31a7ce1d1e..75ce4762df 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp @@ -6,21 +6,11 @@ */ #include "RealTimeHeightDeterministicNPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::RealTimeHeightDeterministicNPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::RealTimeHeightDeterministicNPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::RealTimeHeightDeterministicNPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::RealTimeHeightDeterministicNPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::RealTimeHeightDeterministicNPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h index 59e56a0c2f..4e7acbc054 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h @@ -32,14 +32,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -889,52 +886,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "RealTimeHeightDeterministicNPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static RealTimeHeightDeterministicNPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, RealTimeHeightDeterministicNPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const RealTimeHeightDeterministicNPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const RealTimeHeightDeterministicNPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -1269,117 +1220,6 @@ RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSym return ss.str(); } -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, RealTimeHeightDeterministicNPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> stackSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - ext::set<StateType> initialStates = AutomatonFromXMLParser::parseInitialStates<StateType>(input); - PushdownStoreSymbolType bottomOfTheStackSymbol = AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - RealTimeHeightDeterministicNPDA automaton(std::move(bottomOfTheStackSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); - automaton.setInitialStates(std::move(initialStates)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<RealTimeHeightDeterministicNPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, RealTimeHeightDeterministicNPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, RealTimeHeightDeterministicNPDA& automaton) { - if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - PushdownStoreSymbolType push = AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); - - automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); - } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); - PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); - } else { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); - } -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const RealTimeHeightDeterministicNPDA & automaton ) { - out.emplace_back(RealTimeHeightDeterministicNPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialStates(out, automaton.getInitialStates()); - AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions(out, automaton ); - - out.emplace_back(RealTimeHeightDeterministicNPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const RealTimeHeightDeterministicNPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getCallTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, target.first); - AutomatonToXMLComposer::composeTransitionSinglePush(out, target.second); - - out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); - } - } - for(const auto& transition : automaton.getReturnTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, target); - - out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); - } - } - for(const auto& transition : automaton.getLocalTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, target); - - out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); - } - } - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/SinglePopDPDA.cpp b/alib2data/src/automaton/PDA/SinglePopDPDA.cpp index a41be41057..6c17b30ce7 100644 --- a/alib2data/src/automaton/PDA/SinglePopDPDA.cpp +++ b/alib2data/src/automaton/PDA/SinglePopDPDA.cpp @@ -6,21 +6,11 @@ */ #include "SinglePopDPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::SinglePopDPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::SinglePopDPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::SinglePopDPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::SinglePopDPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::SinglePopDPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/SinglePopDPDA.h b/alib2data/src/automaton/PDA/SinglePopDPDA.h index 5755a26f7d..459170336e 100644 --- a/alib2data/src/automaton/PDA/SinglePopDPDA.h +++ b/alib2data/src/automaton/PDA/SinglePopDPDA.h @@ -33,14 +33,11 @@ #include <ostream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -532,52 +529,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "SinglePopDPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static SinglePopDPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, SinglePopDPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const SinglePopDPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const SinglePopDPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -731,75 +682,6 @@ SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType return ss.str(); } -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, SinglePopDPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> stackSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType initialPushdownStoreSymbol = AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<SinglePopDPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, SinglePopDPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, SinglePopDPDA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); - PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - ext::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const SinglePopDPDA & automaton ) { - out.emplace_back(SinglePopDPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions ( out, automaton ); - - out.emplace_back(SinglePopDPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const SinglePopDPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); - AutomatonToXMLComposer::composeTransitionPush(out, transition.second.second); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp index 29e565dc4a..ab4db62db6 100644 --- a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp +++ b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp @@ -6,21 +6,11 @@ */ #include "SinglePopNPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::SinglePopNPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::SinglePopNPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::SinglePopNPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::SinglePopNPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::SinglePopNPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.h b/alib2data/src/automaton/PDA/SinglePopNPDA.h index 73392c0dc5..3ec9017c3b 100644 --- a/alib2data/src/automaton/PDA/SinglePopNPDA.h +++ b/alib2data/src/automaton/PDA/SinglePopNPDA.h @@ -32,14 +32,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -567,52 +564,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "SinglePopNPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static SinglePopNPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, SinglePopNPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const SinglePopNPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const SinglePopNPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -774,77 +725,6 @@ SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType return ss.str(); } -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, SinglePopNPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> stackSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType initialPushdownStoreSymbol = AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<SinglePopNPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, SinglePopNPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, SinglePopNPDA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); - PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - ext::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const SinglePopNPDA & automaton ) { - out.emplace_back(SinglePopNPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions ( out, automaton ); - - out.emplace_back(SinglePopNPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const SinglePopNPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, target.first); - AutomatonToXMLComposer::composeTransitionPush(out, target.second); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp index b3a90d9805..0c59c03958 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp +++ b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp @@ -6,21 +6,11 @@ */ #include "VisiblyPushdownDPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::VisiblyPushdownDPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::VisiblyPushdownDPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::VisiblyPushdownDPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::VisiblyPushdownDPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::VisiblyPushdownDPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h index e2a677b620..e642b41f9f 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h +++ b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h @@ -31,14 +31,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -709,52 +706,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "VisiblyPushdownDPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static VisiblyPushdownDPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, VisiblyPushdownDPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const VisiblyPushdownDPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const VisiblyPushdownDPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -999,116 +950,6 @@ VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::ope return ss.str(); } -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, VisiblyPushdownDPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> callAlphabet = AutomatonFromXMLParser::parseCallInputAlphabet<InputSymbolType>(input); - ext::set<InputSymbolType> returnAlphabet = AutomatonFromXMLParser::parseReturnInputAlphabet<InputSymbolType>(input); - ext::set<InputSymbolType> localAlphabet = AutomatonFromXMLParser::parseLocalInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> stackSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - PushdownStoreSymbolType bottomOfTheStackSymbol = AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(bottomOfTheStackSymbol)); - automaton.setStates(std::move(states)); - automaton.setCallInputAlphabet(std::move(callAlphabet)); - automaton.setReturnInputAlphabet(std::move(returnAlphabet)); - automaton.setLocalInputAlphabet(std::move(localAlphabet)); - automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<VisiblyPushdownDPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, VisiblyPushdownDPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, VisiblyPushdownDPDA& automaton) { - if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - PushdownStoreSymbolType push = AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); - - automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); - } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); - PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); - } else { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); - } -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const VisiblyPushdownDPDA & automaton ) { - out.emplace_back(VisiblyPushdownDPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeCallInputAlphabet(out, automaton.getCallInputAlphabet()); - AutomatonToXMLComposer::composeReturnInputAlphabet(out, automaton.getReturnInputAlphabet()); - AutomatonToXMLComposer::composeLocalInputAlphabet(out, automaton.getLocalInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions ( out, automaton ); - - out.emplace_back(VisiblyPushdownDPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::composeTransitions ( ext::deque < sax::Token > & out, const VisiblyPushdownDPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getCallTransitions()) { - out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); - AutomatonToXMLComposer::composeTransitionSinglePush(out, transition.second.second); - - out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); - } - for(const auto& transition : automaton.getReturnTransitions()) { - out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second); - - out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); - } - for(const auto& transition : automaton.getLocalTransitions()) { - out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second); - - out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); - } - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp index 6338e0ebb2..0c1353aa16 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp +++ b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp @@ -6,21 +6,11 @@ */ #include "VisiblyPushdownNPDA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::VisiblyPushdownNPDA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::VisiblyPushdownNPDA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::VisiblyPushdownNPDA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::VisiblyPushdownNPDA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::VisiblyPushdownNPDA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h index e466e12e87..877eae325a 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h +++ b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h @@ -31,14 +31,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -761,52 +758,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "VisiblyPushdownNPDA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static VisiblyPushdownNPDA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, VisiblyPushdownNPDA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const VisiblyPushdownNPDA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const VisiblyPushdownNPDA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -1035,123 +986,6 @@ VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::ope return ss.str(); } -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, VisiblyPushdownNPDA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<InputSymbolType> callInputAlphabet = AutomatonFromXMLParser::parseCallInputAlphabet<InputSymbolType>(input); - ext::set<InputSymbolType> returnInputAlphabet = AutomatonFromXMLParser::parseReturnInputAlphabet<InputSymbolType>(input); - ext::set<InputSymbolType> localInputAlphabet = AutomatonFromXMLParser::parseLocalInputAlphabet<InputSymbolType>(input); - ext::set<PushdownStoreSymbolType> stackSymbols = AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); - ext::set<StateType> initialStates = AutomatonFromXMLParser::parseInitialStates<StateType>(input); - PushdownStoreSymbolType bottomOfTheStackSymbol = AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(bottomOfTheStackSymbol)); - automaton.setStates(std::move(states)); - automaton.setCallInputAlphabet(std::move(callInputAlphabet)); - automaton.setReturnInputAlphabet(std::move(returnInputAlphabet)); - automaton.setLocalInputAlphabet(std::move(localInputAlphabet)); - automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); - automaton.setInitialStates(std::move(initialStates)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<VisiblyPushdownNPDA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, VisiblyPushdownNPDA::getXmlTagName()); - return automaton; -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, VisiblyPushdownNPDA& automaton) { - if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol < InputSymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - PushdownStoreSymbolType push = AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); - - automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); - } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol < InputSymbolType > ( input ); - PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); - } else { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - InputSymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol < InputSymbolType > ( input ); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - - automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); - } -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::compose ( ext::deque < sax::Token > & out, const VisiblyPushdownNPDA & automaton ) { - out.emplace_back(VisiblyPushdownNPDA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeCallInputAlphabet(out, automaton.getCallInputAlphabet()); - AutomatonToXMLComposer::composeReturnInputAlphabet(out, automaton.getReturnInputAlphabet()); - AutomatonToXMLComposer::composeLocalInputAlphabet(out, automaton.getLocalInputAlphabet()); - AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); - AutomatonToXMLComposer::composeInitialStates(out, automaton.getInitialStates()); - AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions ( out, automaton ); - - out.emplace_back(VisiblyPushdownNPDA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > -void VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::composeTransitions(ext::deque<sax::Token>& out, const VisiblyPushdownNPDA & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getCallTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, target.first); - AutomatonToXMLComposer::composeTransitionSinglePush(out, target.second); - - out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); - } - } - for(const auto& transition : automaton.getReturnTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, std::get<1>(transition.first)); - AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); - AutomatonToXMLComposer::composeTransitionTo(out, target); - - out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); - } - } - for(const auto& transition : automaton.getLocalTransitions()) { - for(const auto& target: transition.second) { - out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, target); - - out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); - } - } - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > object::ObjectBase* VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/TA/DFTA.cpp b/alib2data/src/automaton/TA/DFTA.cpp index 555cad4ccb..f7713484b4 100644 --- a/alib2data/src/automaton/TA/DFTA.cpp +++ b/alib2data/src/automaton/TA/DFTA.cpp @@ -6,21 +6,11 @@ */ #include "DFTA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::DFTA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::DFTA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::DFTA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::DFTA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::DFTA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/TA/DFTA.h b/alib2data/src/automaton/TA/DFTA.h index a337340d8c..197ba418ad 100644 --- a/alib2data/src/automaton/TA/DFTA.h +++ b/alib2data/src/automaton/TA/DFTA.h @@ -31,16 +31,12 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include <common/ranked_symbol.hpp> -#include <alphabet/xml/RankedSymbol.h> #include "../AutomatonFeatures.h" #include "../AutomatonException.h" #include "../AutomatonBase.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -353,52 +349,6 @@ public: */ virtual operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "DFTA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static DFTA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, DFTA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const DFTA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const DFTA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -495,64 +445,6 @@ DFTA < SymbolType, RankType, StateType >::operator std::string () const { return ss.str(); } -template<class SymbolType, class RankType, class StateType > -DFTA < SymbolType, RankType, StateType > DFTA < SymbolType, RankType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, DFTA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<common::ranked_symbol < SymbolType, RankType >> inputSymbols = AutomatonFromXMLParser::parseRankedInputAlphabet<common::ranked_symbol < SymbolType, RankType >>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - DFTA < SymbolType, RankType, StateType > automaton; - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<DFTA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, DFTA::getXmlTagName()); - return automaton; -} - -template<class SymbolType, class RankType, class StateType > -void DFTA < SymbolType, RankType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, DFTA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - common::ranked_symbol < SymbolType, RankType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<common::ranked_symbol < SymbolType, RankType >>(input); - ext::vector<StateType> from = AutomatonFromXMLParser::parseTransitionFromMultiple<StateType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(inputSymbol), std::move(from), std::move(to)); -} - -template<class SymbolType, class RankType, class StateType > -void DFTA < SymbolType, RankType, StateType >::compose(ext::deque<sax::Token>& out, const DFTA & automaton ) { - out.emplace_back(DFTA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeRankedInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions(out, automaton); - - out.emplace_back(DFTA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template<class SymbolType, class RankType, class StateType > -void DFTA < SymbolType, RankType, StateType >::composeTransitions(ext::deque<sax::Token>& out, const DFTA & automaton ) { - out.emplace_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); - for(const auto& transition : automaton.getTransitions()) { - out.emplace_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); - - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, transition.second); - - out.emplace_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); - } - - out.emplace_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); -} - template < class SymbolType, class RankType, class StateType > object::ObjectBase* DFTA < SymbolType, RankType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/TA/NFTA.cpp b/alib2data/src/automaton/TA/NFTA.cpp index e3d385fc4b..da47c080f6 100644 --- a/alib2data/src/automaton/TA/NFTA.cpp +++ b/alib2data/src/automaton/TA/NFTA.cpp @@ -6,21 +6,11 @@ */ #include "NFTA.h" -#include <automaton/Automaton.h> -#include <object/Object.h> #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::NFTA < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::NFTA < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::NFTA < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NFTA < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NFTA < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/TA/NFTA.h b/alib2data/src/automaton/TA/NFTA.h index 859e2c5cfd..8f82a1102f 100644 --- a/alib2data/src/automaton/TA/NFTA.h +++ b/alib2data/src/automaton/TA/NFTA.h @@ -31,14 +31,11 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../AutomatonException.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -378,52 +375,6 @@ public: */ virtual operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "NFTA"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static NFTA parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, NFTA & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const NFTA & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const NFTA & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -552,66 +503,6 @@ NFTA < SymbolType, RankType, StateType >::operator std::string () const { return ss.str(); } -template < class SymbolType, class RankType, class StateType > -NFTA < SymbolType, RankType, StateType > NFTA < SymbolType, RankType, StateType >::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, NFTA::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<common::ranked_symbol < SymbolType, RankType >> inputSymbols = AutomatonFromXMLParser::parseRankedInputAlphabet<common::ranked_symbol < SymbolType, RankType >>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - NFTA < SymbolType, RankType, StateType > automaton; - automaton.setStates(std::move(states)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<NFTA>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, NFTA::getXmlTagName()); - return automaton; -} - -template < class SymbolType, class RankType, class StateType > -void NFTA < SymbolType, RankType, StateType >::parseTransition(ext::deque<sax::Token>::iterator& input, NFTA& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - common::ranked_symbol < SymbolType, RankType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<common::ranked_symbol < SymbolType, RankType >>(input); - ext::vector<StateType> from = AutomatonFromXMLParser::parseTransitionFromMultiple<StateType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(inputSymbol), std::move(from), std::move(to)); -} - -template < class SymbolType, class RankType, class StateType > -void NFTA < SymbolType, RankType, StateType >::compose(ext::deque<sax::Token>& out, const NFTA & automaton ) { - out.emplace_back(NFTA::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeRankedInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions(out, automaton); - - out.emplace_back(NFTA::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template < class SymbolType, class RankType, class StateType > -void NFTA < SymbolType, RankType, StateType >::composeTransitions(ext::deque<sax::Token>& out, const NFTA & automaton ) { - out.emplace_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); - for(const auto& transition : automaton.getTransitions()) { - for(const auto& targetState: transition.second) { - out.emplace_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); - - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, targetState); - - out.emplace_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); - } - } - - out.emplace_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); -} - template < class SymbolType, class RankType, class StateType > object::ObjectBase* NFTA < SymbolType, RankType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/TM/OneTapeDTM.cpp b/alib2data/src/automaton/TM/OneTapeDTM.cpp index 7711dc4bcb..5d10fd850d 100644 --- a/alib2data/src/automaton/TM/OneTapeDTM.cpp +++ b/alib2data/src/automaton/TM/OneTapeDTM.cpp @@ -7,21 +7,10 @@ #include "OneTapeDTM.h" -#include <automaton/Automaton.h> -#include <object/Object.h> - #include <registration/ValuePrinterRegistration.hpp> -#include <registration/XmlRegistration.hpp> -#include <registration/CastRegistration.hpp> namespace { static auto valuePrinter = registration::ValuePrinterRegister < automaton::OneTapeDTM < > > ( ); -static auto xmlWrite = registration::XmlWriterRegister < automaton::OneTapeDTM < > > ( ); -static auto xmlRead = registration::XmlReaderRegister < automaton::OneTapeDTM < > > ( ); - -static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::OneTapeDTM < > > ( ); -static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::OneTapeDTM < > > ( ); - } /* namespace */ diff --git a/alib2data/src/automaton/TM/OneTapeDTM.h b/alib2data/src/automaton/TM/OneTapeDTM.h index b1b1a2728d..3e60b20eba 100644 --- a/alib2data/src/automaton/TM/OneTapeDTM.h +++ b/alib2data/src/automaton/TM/OneTapeDTM.h @@ -31,15 +31,12 @@ #include <sstream> #include <core/components.hpp> -#include <sax/FromXMLParserHelper.h> #include <object/UniqueObject.h> #include "../AutomatonException.h" #include "../AutomatonBase.h" #include "../AutomatonFeatures.h" #include "../common/Shift.h" -#include "../common/AutomatonFromXMLParser.h" -#include "../common/AutomatonToXMLComposer.h" #include "../common/AutomatonNormalize.h" #include <alphabet/common/SymbolNormalize.h> @@ -456,52 +453,6 @@ public: */ virtual explicit operator std::string ( ) const override; - /** - * \brief The XML tag name of class. - * - * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. - * - * \returns string representing the XML tag name of the class - */ - static const std::string & getXmlTagName() { - static std::string xmlTagName = "OneTapeDTM"; - - return xmlTagName; - } - - /** - * Parsing from a sequence of xml tokens helper. - * - * \params input the iterator to sequence of xml tokens to parse from - * - * \returns the new instance of the automaton - */ - static OneTapeDTM parse ( ext::deque < sax::Token >::iterator & input ); - - /** - * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. - * - * \params input the iterator to sequence of xml tokens to parse from - * \params automaton the automaton to add the rule to - */ - static void parseTransition ( ext::deque < sax::Token >::iterator & input, OneTapeDTM & automaton ); - - /** - * Composing to a sequence of xml tokens helper. - * - * \param out the sink for new xml tokens representing the automaton - * \param automaton the automaton to compose - */ - static void compose ( ext::deque < sax::Token > & out, const OneTapeDTM & automaton ); - - /** - * Helper for composing transitions of the automaton to a sequence of xml tokens. - * - * \param out the sink for xml tokens representing the rules of the automaton - * \param automaton the automaton to compose - */ - static void composeTransitions ( ext::deque < sax::Token > & out, const OneTapeDTM & automaton ); - /** * @copydoc object::ObjectBase::inc() */ @@ -618,75 +569,6 @@ OneTapeDTM<SymbolType, StateType>::operator std::string () const { return ss.str(); } -template<class SymbolType, class StateType > -OneTapeDTM<SymbolType, StateType> OneTapeDTM<SymbolType, StateType>::parse(ext::deque<sax::Token>::iterator& input) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, OneTapeDTM::getXmlTagName()); - - ext::set<StateType> states = AutomatonFromXMLParser::parseStates<StateType>(input); - ext::set<SymbolType> tapeSymbols = AutomatonFromXMLParser::parseTapeAlphabet<SymbolType>(input); - ext::set<SymbolType> inputSymbols = AutomatonFromXMLParser::parseInputAlphabet<SymbolType>(input); - SymbolType blank = AutomatonFromXMLParser::parseBlankSymbol<SymbolType>(input); - StateType initialState = AutomatonFromXMLParser::parseInitialState<StateType>(input); - ext::set<StateType> finalStates = AutomatonFromXMLParser::parseFinalStates<StateType>(input); - - OneTapeDTM automaton(std::move(initialState), std::move(blank)); - automaton.setStates(std::move(states)); - automaton.setTapeAlphabet(std::move(tapeSymbols)); - automaton.setInputAlphabet(std::move(inputSymbols)); - automaton.setFinalStates(std::move(finalStates)); - - AutomatonFromXMLParser::parseTransitions<OneTapeDTM>(input, automaton); - - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, OneTapeDTM::getXmlTagName()); - return automaton; -} - -template<class SymbolType, class StateType > -void OneTapeDTM<SymbolType, StateType>::parseTransition(ext::deque<sax::Token>::iterator& input, OneTapeDTM<SymbolType, StateType>& automaton) { - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); - StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - SymbolType inputSymbol = AutomatonFromXMLParser::parseTransitionInputSymbol<SymbolType>(input); - StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); - SymbolType outputSymbol = AutomatonFromXMLParser::parseTransitionOutputSymbol<SymbolType>(input); - Shift shift = AutomatonFromXMLParser::parseTransitionShift(input); - sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); - - automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(outputSymbol), shift); -} - -template<class SymbolType, class StateType > -void OneTapeDTM<SymbolType, StateType>::compose(ext::deque<sax::Token>& out, const OneTapeDTM & automaton ) { - out.emplace_back(OneTapeDTM::getXmlTagName(), sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeStates(out, automaton.getStates()); - AutomatonToXMLComposer::composeTapeAlphabet(out, automaton.getTapeAlphabet()); - AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); - AutomatonToXMLComposer::composeBlankSymbol(out, automaton.getBlankSymbol()); - AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); - AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); - composeTransitions(out, automaton); - - out.emplace_back(OneTapeDTM::getXmlTagName(), sax::Token::TokenType::END_ELEMENT); -} - -template<class SymbolType, class StateType > -void OneTapeDTM<SymbolType, StateType>::composeTransitions(ext::deque<sax::Token>& out, const OneTapeDTM & automaton ) { - out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); - for(const auto& transition : automaton.getTransitions()) { - out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); - - AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); - AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); - AutomatonToXMLComposer::composeTransitionTo(out, std::get<0>(transition.second)); - AutomatonToXMLComposer::composeTransitionOutputSymbol(out, std::get<1>(transition.second)); - AutomatonToXMLComposer::composeTransitionShift(out, std::get<2>(transition.second)); - - out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); - } - - out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); -} - template < class SymbolType, class StateType > object::ObjectBase* OneTapeDTM < SymbolType, StateType >::inc() && { return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0)); diff --git a/alib2data/src/automaton/xml/Counter/OneCounter.h b/alib2data/src/automaton/xml/Counter/OneCounter.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/alib2data/src/automaton/xml/Counter/TwoCounter.h b/alib2data/src/automaton/xml/Counter/TwoCounter.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/alib2data/src/automaton/xml/FSM/CompactNFA.cpp b/alib2data/src/automaton/xml/FSM/CompactNFA.cpp new file mode 100644 index 0000000000..494a5f29b4 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/CompactNFA.cpp @@ -0,0 +1,22 @@ +/* + * CompactNFA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "CompactNFA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::CompactNFA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::CompactNFA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::CompactNFA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::CompactNFA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/FSM/CompactNFA.h b/alib2data/src/automaton/xml/FSM/CompactNFA.h new file mode 100644 index 0000000000..c99bf87539 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/CompactNFA.h @@ -0,0 +1,148 @@ +/* + * CompactNFA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_COMPACT_DFA_H_ +#define _XML_COMPACT_DFA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/FSM/CompactNFA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class StateType > +struct xmlApi < automaton::CompactNFA < SymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "CompactNFA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::CompactNFA < SymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::CompactNFA < SymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::CompactNFA < SymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::CompactNFA < SymbolType, StateType > & automaton ); +}; + +template < class SymbolType, class StateType > +automaton::CompactNFA < SymbolType, StateType > xmlApi < automaton::CompactNFA < SymbolType, StateType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set < StateType > states = automaton::AutomatonFromXMLParser::parseStates < StateType > ( input ); + ext::set < SymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState < StateType > ( input ); + ext::set < StateType > finalStates = automaton::AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); + + automaton::CompactNFA < SymbolType, StateType > automaton ( std::move ( initialState ) ); + + automaton.setStates ( std::move ( states ) ); + automaton.setInputAlphabet ( std::move ( inputSymbols ) ); + automaton.setFinalStates ( std::move ( finalStates ) ); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::CompactNFA < SymbolType, StateType > >::parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::CompactNFA < SymbolType, StateType > & automaton ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); + ext::vector < SymbolType > inputString = automaton::AutomatonFromXMLParser::parseTransitionInputSymbolMultiple < SymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); + + automaton.addTransition ( std::move ( from ), std::move ( inputString ), std::move ( to ) ); +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::CompactNFA < SymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::CompactNFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); + automaton::AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); + automaton::AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); + automaton::AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::CompactNFA < SymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::CompactNFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); + + for ( const auto & transition : automaton.getTransitions ( ) ) + for ( const auto & targetState : transition.second ) { + out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbolMultiple ( out, transition.first.second ); + automaton::AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); + + out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); + } + + out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace core */ + +#endif /* _XML_COMPACT_DFA_H_ */ diff --git a/alib2data/src/automaton/xml/FSM/DFA.cpp b/alib2data/src/automaton/xml/FSM/DFA.cpp new file mode 100644 index 0000000000..5e4b221aeb --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/DFA.cpp @@ -0,0 +1,22 @@ +/* + * DFA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "DFA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::DFA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::DFA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::DFA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::DFA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/FSM/DFA.h b/alib2data/src/automaton/xml/FSM/DFA.h new file mode 100644 index 0000000000..906a4d7df9 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/DFA.h @@ -0,0 +1,147 @@ +/* + * DFA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_DFA_H_ +#define _XML_DFA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/FSM/DFA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class StateType > +struct xmlApi < automaton::DFA < SymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "DFA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::DFA < SymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::DFA < SymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::DFA < SymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::DFA < SymbolType, StateType > & automaton ); +}; + +template < class SymbolType, class StateType > +automaton::DFA < SymbolType, StateType > xmlApi < automaton::DFA < SymbolType, StateType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set < StateType > states = automaton::AutomatonFromXMLParser::parseStates < StateType > ( input ); + ext::set < SymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState < StateType > ( input ); + ext::set < StateType > finalStates = automaton::AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); + + automaton::DFA < SymbolType, StateType> automaton ( std::move ( initialState ) ); + + automaton.setStates ( std::move ( states ) ); + automaton.setInputAlphabet ( std::move ( inputSymbols ) ); + automaton.setFinalStates ( std::move ( finalStates ) ); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::DFA < SymbolType, StateType > >::parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::DFA < SymbolType, StateType > & automaton ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); + SymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol < SymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); + + automaton.addTransition ( std::move ( from ), std::move ( inputSymbol ), std::move ( to ) ); +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::DFA < SymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::DFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); + automaton::AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); + automaton::AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); + automaton::AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::DFA < SymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::DFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); + + for ( const auto & transition : automaton.getTransitions ( ) ) { + out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol ( out, transition.first.second ); + automaton::AutomatonToXMLComposer::composeTransitionTo ( out, transition.second ); + + out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); + } + + out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace core */ + +#endif /* _XML_DFA_H_ */ diff --git a/alib2data/src/automaton/xml/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/xml/FSM/EpsilonNFA.cpp new file mode 100644 index 0000000000..a0629ecd98 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/EpsilonNFA.cpp @@ -0,0 +1,22 @@ +/* + * EpsilonNFA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "EpsilonNFA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::EpsilonNFA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::EpsilonNFA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::EpsilonNFA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::EpsilonNFA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/FSM/EpsilonNFA.h b/alib2data/src/automaton/xml/FSM/EpsilonNFA.h new file mode 100644 index 0000000000..dac7d62d03 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/EpsilonNFA.h @@ -0,0 +1,148 @@ +/* + * EpsilonNFA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_EPSILON_NFA_H_ +#define _XML_EPSILON_NFA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/FSM/EpsilonNFA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class EpsilonType, class StateType > +struct xmlApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "EpsilonNFA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton ); +}; + +template < class SymbolType, class EpsilonType, class StateType > +automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > xmlApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set < StateType > states = automaton::AutomatonFromXMLParser::parseStates < StateType > ( input ); + ext::set < SymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState < StateType > ( input ); + ext::set < StateType > finalStates = automaton::AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); + + automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > automaton ( std::move ( initialState ) ); + + automaton.setStates ( std::move ( states ) ); + automaton.setInputAlphabet ( std::move ( inputSymbols ) ); + automaton.setFinalStates ( std::move ( finalStates ) ); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName() ); + return automaton; +} + +template < class SymbolType, class EpsilonType, class StateType > +void xmlApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >::parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); + ext::variant < EpsilonType, SymbolType > inputVariant = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, SymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); + + automaton.addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) ); +} + +template < class SymbolType, class EpsilonType, class StateType > +void xmlApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); + automaton::AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); + automaton::AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); + automaton::AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType, class EpsilonType, class StateType > +void xmlApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton ) { + out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); + + for ( const auto & transition : automaton.getTransitions ( ) ) + for ( const auto & targetState : transition.second ) { + out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol ( out, transition.first.second ); + automaton::AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); + + out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); + } + + out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace core */ + +#endif /* _XML_EPSILON_NFA_H_ */ diff --git a/alib2data/src/automaton/xml/FSM/ExtendedNFA.cpp b/alib2data/src/automaton/xml/FSM/ExtendedNFA.cpp new file mode 100644 index 0000000000..94554666cc --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/ExtendedNFA.cpp @@ -0,0 +1,22 @@ +/* + * ExtendedNFA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "ExtendedNFA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::ExtendedNFA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::ExtendedNFA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::ExtendedNFA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::ExtendedNFA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/FSM/ExtendedNFA.h b/alib2data/src/automaton/xml/FSM/ExtendedNFA.h new file mode 100644 index 0000000000..9d7c6ae988 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/ExtendedNFA.h @@ -0,0 +1,148 @@ +/* + * ExtendedNFA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_EXTENDED_NFA_H_ +#define _XML_EXTENDED_NFA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/FSM/ExtendedNFA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class StateType > +struct xmlApi < automaton::ExtendedNFA < SymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "ExtendedNFA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::ExtendedNFA < SymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::ExtendedNFA < SymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::ExtendedNFA < SymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::ExtendedNFA < SymbolType, StateType > & automaton ); +}; + +template<class SymbolType, class StateType > +automaton::ExtendedNFA < SymbolType, StateType > xmlApi < automaton::ExtendedNFA < SymbolType, StateType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set < StateType > states = automaton::AutomatonFromXMLParser::parseStates < StateType > ( input ); + ext::set < SymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState < StateType > ( input ); + ext::set < StateType > finalStates = automaton::AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); + + automaton::ExtendedNFA < SymbolType, StateType > automaton ( std::move ( initialState ) ); + + automaton.setStates ( std::move ( states ) ); + automaton.setInputAlphabet ( std::move ( inputSymbols ) ); + automaton.setFinalStates ( std::move ( finalStates ) ); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::ExtendedNFA < SymbolType, StateType > >::parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::ExtendedNFA < SymbolType, StateType > & automaton ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); + regexp::UnboundedRegExpStructure < SymbolType > inputRegexp = automaton::AutomatonFromXMLParser::parseTransitionInputRegexp < SymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); + + automaton.addTransition ( std::move ( from ), std::move ( inputRegexp ), std::move ( to ) ); +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::ExtendedNFA < SymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::ExtendedNFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); + automaton::AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); + automaton::AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); + automaton::AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::ExtendedNFA < SymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::ExtendedNFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); + + for ( const auto & transition : automaton.getTransitions ( ) ) + for ( const auto & targetState : transition.second ) { + out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); + automaton::AutomatonToXMLComposer::composeTransitionInputRegexp ( out, transition.first.second ); + automaton::AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); + + out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); + } + + out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace core */ + +#endif /* _XML_EXTENDED_NFA_H_ */ diff --git a/alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.cpp b/alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.cpp new file mode 100644 index 0000000000..ba115fd059 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.cpp @@ -0,0 +1,22 @@ +/* + * MultiInitialStateNFA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "MultiInitialStateNFA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::MultiInitialStateNFA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::MultiInitialStateNFA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::MultiInitialStateNFA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::MultiInitialStateNFA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.h b/alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.h new file mode 100644 index 0000000000..c464b9ef9f --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/MultiInitialStateNFA.h @@ -0,0 +1,149 @@ +/* + * MultiInitialStateNFA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_MULTI_INITIAL_STATE_NFA_H_ +#define _XML_MULTI_INITIAL_STATE_NFA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/FSM/MultiInitialStateNFA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class StateType > +struct xmlApi < automaton::MultiInitialStateNFA < SymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "MultiInitialStateNFA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::MultiInitialStateNFA < SymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton ); +}; + +template < class SymbolType, class StateType > +automaton::MultiInitialStateNFA < SymbolType, StateType > xmlApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set < StateType > states = automaton::AutomatonFromXMLParser::parseStates < StateType > ( input ); + ext::set < SymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); + ext::set < StateType > initialStates = automaton::AutomatonFromXMLParser::parseInitialStates < StateType > ( input ); + ext::set < StateType > finalStates = automaton::AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); + + automaton::MultiInitialStateNFA < SymbolType, StateType > automaton; + + automaton.setStates ( std::move ( states ) ); + automaton.setInputAlphabet ( std::move ( inputSymbols ) ); + automaton.setInitialStates ( std::move ( initialStates ) ); + automaton.setFinalStates ( std::move ( finalStates ) ); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); + SymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol < SymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); + + automaton.addTransition ( std::move ( from ), std::move ( inputSymbol ), std::move ( to ) ); +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); + automaton::AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); + automaton::AutomatonToXMLComposer::composeInitialStates ( out, automaton.getInitialStates ( ) ); + automaton::AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType, class StateType > +void xmlApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); + + for ( const auto & transition : automaton.getTransitions ( ) ) + for ( const auto & targetState : transition.second ) { + out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol ( out, transition.first.second ); + automaton::AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); + + out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); + } + + out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace core */ + +#endif /* _XML_MULTI_INITIAL_STATE_NFA_H_ */ diff --git a/alib2data/src/automaton/xml/FSM/NFA.cpp b/alib2data/src/automaton/xml/FSM/NFA.cpp new file mode 100644 index 0000000000..ccb9be9263 --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/NFA.cpp @@ -0,0 +1,22 @@ +/* + * NFA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "NFA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::NFA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::NFA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NFA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NFA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/FSM/NFA.h b/alib2data/src/automaton/xml/FSM/NFA.h new file mode 100644 index 0000000000..53408aae1e --- /dev/null +++ b/alib2data/src/automaton/xml/FSM/NFA.h @@ -0,0 +1,148 @@ +/* + * NFA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_NFA_H_ +#define _XML_NFA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/FSM/NFA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class StateType > +struct xmlApi < automaton::NFA < SymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "NFA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::NFA < SymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::NFA < SymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::NFA < SymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::NFA < SymbolType, StateType > & automaton ); +}; + +template<class SymbolType, class StateType > +automaton::NFA < SymbolType, StateType > xmlApi < automaton::NFA < SymbolType, StateType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set < StateType > states = automaton::AutomatonFromXMLParser::parseStates < StateType > ( input ); + ext::set < SymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < SymbolType > ( input ); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState < StateType > ( input ); + ext::set < StateType > finalStates = automaton::AutomatonFromXMLParser::parseFinalStates < StateType > ( input ); + + automaton::NFA < SymbolType, StateType > automaton ( std::move ( initialState ) ); + + automaton.setStates ( std::move ( states ) ); + automaton.setInputAlphabet ( std::move ( inputSymbols ) ); + automaton.setFinalStates ( std::move ( finalStates ) ); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::NFA < SymbolType, StateType > >::parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::NFA < SymbolType, StateType > & automaton ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); + SymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol < SymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); + + automaton.addTransition ( std::move ( from ), std::move ( inputSymbol ), std::move ( to ) ); +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::NFA < SymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::NFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates ( out, automaton.getStates ( ) ); + automaton::AutomatonToXMLComposer::composeInputAlphabet ( out, automaton.getInputAlphabet ( ) ); + automaton::AutomatonToXMLComposer::composeInitialState ( out, automaton.getInitialState ( ) ); + automaton::AutomatonToXMLComposer::composeFinalStates ( out, automaton.getFinalStates ( ) ); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::NFA < SymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::NFA < SymbolType, StateType > & automaton ) { + out.emplace_back ( "transitions", sax::Token::TokenType::START_ELEMENT ); + + for ( const auto & transition : automaton.getTransitions ( ) ) + for ( const auto & targetState : transition.second ) { + out.emplace_back ( "transition", sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeTransitionFrom ( out, transition.first.first ); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol ( out, transition.first.second ); + automaton::AutomatonToXMLComposer::composeTransitionTo ( out, targetState ); + + out.emplace_back ( "transition", sax::Token::TokenType::END_ELEMENT ); + } + + out.emplace_back ( "transitions", sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace core */ + +#endif /* _XML_NFA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/DPDA.cpp b/alib2data/src/automaton/xml/PDA/DPDA.cpp new file mode 100644 index 0000000000..4810abfd5a --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/DPDA.cpp @@ -0,0 +1,22 @@ +/* + * DPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "DPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::DPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::DPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::DPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::DPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/DPDA.h b/alib2data/src/automaton/xml/PDA/DPDA.h new file mode 100644 index 0000000000..925f19cb35 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/DPDA.h @@ -0,0 +1,154 @@ +/* + * DPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_DPDA_H_ +#define _XML_DPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/DPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "DPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > xmlApi < automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType initialPushdownStoreSymbol = automaton::AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant<EpsilonType, InputSymbolType> inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::vector<PushdownStoreSymbolType> pop = automaton::AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + ext::vector<PushdownStoreSymbolType> push = automaton::AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionPop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); + automaton::AutomatonToXMLComposer::composeTransitionPush(out, transition.second.second); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_DPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/InputDrivenDPDA.cpp b/alib2data/src/automaton/xml/PDA/InputDrivenDPDA.cpp new file mode 100644 index 0000000000..af173af811 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/InputDrivenDPDA.cpp @@ -0,0 +1,22 @@ +/* + * InputDrivenDPDA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "InputDrivenDPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::InputDrivenDPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::InputDrivenDPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::InputDrivenDPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::InputDrivenDPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/InputDrivenDPDA.h b/alib2data/src/automaton/xml/PDA/InputDrivenDPDA.h new file mode 100644 index 0000000000..0c86ce798d --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/InputDrivenDPDA.h @@ -0,0 +1,152 @@ +/* + * InputDrivenDPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_INPUT_DRIVEN_DPDA_H_ +#define _XML_INPUT_DRIVEN_DPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/InputDrivenDPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "InputDrivenDPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > xmlApi < automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType initialPushdownStoreSymbol = automaton::AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton.setPushdownStoreOperations(automaton::AutomatonFromXMLParser::parseInputToPushdownStoreOperation<InputSymbolType, PushdownStoreSymbolType>(input)); + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(to)); +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + automaton::AutomatonToXMLComposer::composeInputToPushdownStoreOperation(out, automaton.getPushdownStoreOperations()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::InputDrivenDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_INPUT_DRIVEN_DPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/InputDrivenNPDA.cpp b/alib2data/src/automaton/xml/PDA/InputDrivenNPDA.cpp new file mode 100644 index 0000000000..6516c33113 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/InputDrivenNPDA.cpp @@ -0,0 +1,22 @@ +/* + * InputDrivenNPDA.cpp + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#include "InputDrivenNPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::InputDrivenNPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::InputDrivenNPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::InputDrivenNPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::InputDrivenNPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/InputDrivenNPDA.h b/alib2data/src/automaton/xml/PDA/InputDrivenNPDA.h new file mode 100644 index 0000000000..61512f78fc --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/InputDrivenNPDA.h @@ -0,0 +1,154 @@ +/* + * InputDrivenNPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_INPUT_DRIVEN_NPDA_H_ +#define _XML_INPUT_DRIVEN_NPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/InputDrivenNPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "InputDrivenNPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > xmlApi < automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType > states = automaton::AutomatonFromXMLParser::parseStates<StateType >(input); + ext::set<InputSymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType >(input); + PushdownStoreSymbolType initialPushdownStoreSymbol = automaton::AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType > finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType >(input); + + automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton.setPushdownStoreOperations(automaton::AutomatonFromXMLParser::parseInputToPushdownStoreOperation<InputSymbolType, PushdownStoreSymbolType>(input)); + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, xmlTagName()); + return automaton; +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType >(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType >(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(to)); +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + automaton::AutomatonToXMLComposer::composeInputToPushdownStoreOperation(out, automaton.getPushdownStoreOperations()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::InputDrivenNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_INPUT_DRIVEN_NPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/NPDA.cpp b/alib2data/src/automaton/xml/PDA/NPDA.cpp new file mode 100644 index 0000000000..52f6431c7f --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/NPDA.cpp @@ -0,0 +1,22 @@ +/* + * NPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "NPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::NPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::NPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/NPDA.h b/alib2data/src/automaton/xml/PDA/NPDA.h new file mode 100644 index 0000000000..bd331edc9c --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/NPDA.h @@ -0,0 +1,156 @@ +/* + * NPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_NPDA_H_ +#define _XML_NPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/NPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName ( ) { + static std::string xmlTagName = "NPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & ou, const automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automatont ); +}; + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > xmlApi < automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set < InputSymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < InputSymbolType > ( input ); + ext::set<PushdownStoreSymbolType> pushdownStoreSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType initialPushdownStoreSymbol = automaton::AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(pushdownStoreSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, InputSymbolType > ( input ); + ext::vector<PushdownStoreSymbolType> pop = automaton::AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + ext::vector<PushdownStoreSymbolType> push = automaton::AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionPop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target.first); + automaton::AutomatonToXMLComposer::composeTransitionPush(out, target.second); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_NPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/NPDTA.cpp b/alib2data/src/automaton/xml/PDA/NPDTA.cpp new file mode 100644 index 0000000000..b854540f52 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/NPDTA.cpp @@ -0,0 +1,22 @@ +/* + * NPDTA.cpp + * + * Created on: 10. 5. 2016 + * Author: Jakub Doupal + */ + +#include "NPDTA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::NPDTA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::NPDTA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NPDTA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NPDTA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/NPDTA.h b/alib2data/src/automaton/xml/PDA/NPDTA.h new file mode 100644 index 0000000000..bd1bca13b9 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/NPDTA.h @@ -0,0 +1,161 @@ +/* + * NPDTA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: 10. 5. 2016 + * Author: Jakub Doupal + */ + +#ifndef _XML_NPDTA_H_ +#define _XML_NPDTA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/NPDTA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "NPDTA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > xmlApi < automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set < InputSymbolType > inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet < InputSymbolType > ( input ); + ext::set<PushdownStoreSymbolType> stackSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + ext::set < OutputSymbolType > outputSymbols = automaton::AutomatonFromXMLParser::parseOutputAlphabet < OutputSymbolType > ( input ); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType initialPushdownStoreSymbol = automaton::AutomatonFromXMLParser::parseInitialPushdownStoreSymbol < PushdownStoreSymbolType > ( input ); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); + automaton.setOutputAlphabet(std::move(outputSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::vector<PushdownStoreSymbolType> pop = automaton::AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + ext::vector<PushdownStoreSymbolType> push = automaton::AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); + ext::vector < OutputSymbolType > output = automaton::AutomatonFromXMLParser::parseTransitionOutputSymbolMultiple < OutputSymbolType > (input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push), std::move(output)); +} + +template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::compose(ext::deque<sax::Token>& out, const automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeOutputAlphabet(out, automaton.getOutputAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::composeTransitions(ext::deque<sax::Token>& out, const automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionPop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, std::get<0>(target)); + automaton::AutomatonToXMLComposer::composeTransitionPush(out, std::get<1>(target)); + automaton::AutomatonToXMLComposer::composeTransitionOutputSymbolMultiple(out, std::get<2>(target)); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_NPDTA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.cpp b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.cpp new file mode 100644 index 0000000000..fadda2739a --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.cpp @@ -0,0 +1,22 @@ +/* + * RealTimeHeightDeterministicDPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "RealTimeHeightDeterministicDPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::RealTimeHeightDeterministicDPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::RealTimeHeightDeterministicDPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::RealTimeHeightDeterministicDPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::RealTimeHeightDeterministicDPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.h b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.h new file mode 100644 index 0000000000..d05dc25fbd --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicDPDA.h @@ -0,0 +1,189 @@ +/* + * RealTimeHeightDeterministicDPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_REAL_TIME_HEIGHT_DETERMINISTIC_DPDA_H_ +#define _XML_REAL_TIME_HEIGHT_DETERMINISTIC_DPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/RealTimeHeightDeterministicDPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "RealTimeHeightDeterministicDPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automatont ); +}; + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > xmlApi < automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> stackSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType bottomOfTheStackSymbol = automaton::AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(bottomOfTheStackSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton) { + if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + PushdownStoreSymbolType push = automaton::AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); + + automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); + } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); + PushdownStoreSymbolType pop = automaton::AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); + } else { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); + } +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getCallTransitions()) { + out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); + automaton::AutomatonToXMLComposer::composeTransitionSinglePush(out, transition.second.second); + + out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); + } + for(const auto& transition : automaton.getReturnTransitions()) { + out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second); + + out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); + } + for(const auto& transition : automaton.getLocalTransitions()) { + out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second); + + out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); + } + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_REAL_TIME_HEIGHT_DETERMINISTIC_DPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.cpp b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.cpp new file mode 100644 index 0000000000..488c9831e0 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.cpp @@ -0,0 +1,22 @@ +/* + * RealTimeHeightDeterministicNPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "RealTimeHeightDeterministicNPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::RealTimeHeightDeterministicNPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::RealTimeHeightDeterministicNPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::RealTimeHeightDeterministicNPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::RealTimeHeightDeterministicNPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.h b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.h new file mode 100644 index 0000000000..9e80f3317d --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/RealTimeHeightDeterministicNPDA.h @@ -0,0 +1,196 @@ +/* + * RealTimeHeightDeterministicNPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_REAL_TIME_HEIGHT_DETERMINISTIC_NPDA_H_ +#define _XML_REAL_TIME_HEIGHT_DETERMINISTIC_NPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "RealTimeHeightDeterministicNPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > xmlApi < automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> stackSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + ext::set<StateType> initialStates = automaton::AutomatonFromXMLParser::parseInitialStates<StateType>(input); + PushdownStoreSymbolType bottomOfTheStackSymbol = automaton::AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(bottomOfTheStackSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); + automaton.setInitialStates(std::move(initialStates)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton) { + if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + PushdownStoreSymbolType push = automaton::AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); + + automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); + } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + PushdownStoreSymbolType pop = automaton::AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); + } else { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); + } +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialStates(out, automaton.getInitialStates()); + automaton::AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getCallTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target.first); + automaton::AutomatonToXMLComposer::composeTransitionSinglePush(out, target.second); + + out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); + } + } + for(const auto& transition : automaton.getReturnTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target); + + out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); + } + } + for(const auto& transition : automaton.getLocalTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target); + + out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); + } + } + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_REAL_TIME_HEIGHT_DETERMINISTIC_NPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/SinglePopDPDA.cpp b/alib2data/src/automaton/xml/PDA/SinglePopDPDA.cpp new file mode 100644 index 0000000000..f45ed52b79 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/SinglePopDPDA.cpp @@ -0,0 +1,22 @@ +/* + * SinglePopDPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "SinglePopDPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::SinglePopDPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::SinglePopDPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::SinglePopDPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::SinglePopDPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/SinglePopDPDA.h b/alib2data/src/automaton/xml/PDA/SinglePopDPDA.h new file mode 100644 index 0000000000..328476b158 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/SinglePopDPDA.h @@ -0,0 +1,154 @@ +/* + * SinglePopDPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_SINGLE_POP_DPDA_H_ +#define _XML_SINGLE_POP_DPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/SinglePopDPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "SinglePopDPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > xmlApi < automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> stackSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType initialPushdownStoreSymbol = automaton::AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + PushdownStoreSymbolType pop = automaton::AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + ext::vector<PushdownStoreSymbolType> push = automaton::AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); + automaton::AutomatonToXMLComposer::composeTransitionPush(out, transition.second.second); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_SINGLE_POP_DPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/SinglePopNPDA.cpp b/alib2data/src/automaton/xml/PDA/SinglePopNPDA.cpp new file mode 100644 index 0000000000..a6d858975a --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/SinglePopNPDA.cpp @@ -0,0 +1,22 @@ +/* + * SinglePopNPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "SinglePopNPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::SinglePopNPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::SinglePopNPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::SinglePopNPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::SinglePopNPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/SinglePopNPDA.h b/alib2data/src/automaton/xml/PDA/SinglePopNPDA.h new file mode 100644 index 0000000000..f9d924986a --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/SinglePopNPDA.h @@ -0,0 +1,156 @@ +/* + * SinglePopNPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_SINGLE_POP_NPDA_H_ +#define _XML_SINGLE_POP_NPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/SinglePopNPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "SinglePopNPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > xmlApi < automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> stackSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType initialPushdownStoreSymbol = automaton::AutomatonFromXMLParser::parseInitialPushdownStoreSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(initialPushdownStoreSymbol)); + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + PushdownStoreSymbolType pop = automaton::AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + ext::vector<PushdownStoreSymbolType> push = automaton::AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to), std::move(push)); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeInitialPushdownStoreSymbol(out, automaton.getInitialSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target.first); + automaton::AutomatonToXMLComposer::composeTransitionPush(out, target.second); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_SINGLE_POP_NPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.cpp b/alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.cpp new file mode 100644 index 0000000000..850d62c103 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.cpp @@ -0,0 +1,22 @@ +/* + * VisiblyPushdownDPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "VisiblyPushdownDPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::VisiblyPushdownDPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::VisiblyPushdownDPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::VisiblyPushdownDPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::VisiblyPushdownDPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.h b/alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.h new file mode 100644 index 0000000000..84f4ae5b48 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/VisiblyPushdownDPDA.h @@ -0,0 +1,195 @@ +/* + * VisiblyPushdownDPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_VISIBLY_PUSHDOWN_DPDA_H_ +#define _XML_VISIBLY_PUSHDOWN_DPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/VisiblyPushdownDPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "VisiblyPushdownDPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > xmlApi < automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> callAlphabet = automaton::AutomatonFromXMLParser::parseCallInputAlphabet<InputSymbolType>(input); + ext::set<InputSymbolType> returnAlphabet = automaton::AutomatonFromXMLParser::parseReturnInputAlphabet<InputSymbolType>(input); + ext::set<InputSymbolType> localAlphabet = automaton::AutomatonFromXMLParser::parseLocalInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> stackSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + PushdownStoreSymbolType bottomOfTheStackSymbol = automaton::AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(initialState), std::move(bottomOfTheStackSymbol)); + automaton.setStates(std::move(states)); + automaton.setCallInputAlphabet(std::move(callAlphabet)); + automaton.setReturnInputAlphabet(std::move(returnAlphabet)); + automaton.setLocalInputAlphabet(std::move(localAlphabet)); + automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton) { + if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + PushdownStoreSymbolType push = automaton::AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); + + automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); + } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); + PushdownStoreSymbolType pop = automaton::AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); + } else { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<InputSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); + } +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeCallInputAlphabet(out, automaton.getCallInputAlphabet()); + automaton::AutomatonToXMLComposer::composeReturnInputAlphabet(out, automaton.getReturnInputAlphabet()); + automaton::AutomatonToXMLComposer::composeLocalInputAlphabet(out, automaton.getLocalInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::composeTransitions ( ext::deque < sax::Token > & out, const automaton::VisiblyPushdownDPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getCallTransitions()) { + out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second.first); + automaton::AutomatonToXMLComposer::composeTransitionSinglePush(out, transition.second.second); + + out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); + } + for(const auto& transition : automaton.getReturnTransitions()) { + out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second); + + out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); + } + for(const auto& transition : automaton.getLocalTransitions()) { + out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second); + + out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); + } + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_VISIBLY_PUSHDOWN_DPDA_H_ */ diff --git a/alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.cpp b/alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.cpp new file mode 100644 index 0000000000..e46ac9eb3a --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.cpp @@ -0,0 +1,22 @@ +/* + * VisiblyPushdownNPDA.cpp + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "VisiblyPushdownNPDA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::VisiblyPushdownNPDA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::VisiblyPushdownNPDA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::VisiblyPushdownNPDA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::VisiblyPushdownNPDA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.h b/alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.h new file mode 100644 index 0000000000..763bd142c6 --- /dev/null +++ b/alib2data/src/automaton/xml/PDA/VisiblyPushdownNPDA.h @@ -0,0 +1,202 @@ +/* + * VisiblyPushdownNPDA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 25, 2013 + * Author: Jan Travnicek + */ + +#ifndef _XML_VISIBLY_PUSHDOWN_NPDA_H_ +#define _XML_VISIBLY_PUSHDOWN_NPDA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/PDA/VisiblyPushdownNPDA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +struct xmlApi < automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "VisiblyPushdownNPDA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ); +}; + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > xmlApi < automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<InputSymbolType> callInputAlphabet = automaton::AutomatonFromXMLParser::parseCallInputAlphabet<InputSymbolType>(input); + ext::set<InputSymbolType> returnInputAlphabet = automaton::AutomatonFromXMLParser::parseReturnInputAlphabet<InputSymbolType>(input); + ext::set<InputSymbolType> localInputAlphabet = automaton::AutomatonFromXMLParser::parseLocalInputAlphabet<InputSymbolType>(input); + ext::set<PushdownStoreSymbolType> stackSymbols = automaton::AutomatonFromXMLParser::parsePushdownStoreAlphabet<PushdownStoreSymbolType>(input); + ext::set<StateType> initialStates = automaton::AutomatonFromXMLParser::parseInitialStates<StateType>(input); + PushdownStoreSymbolType bottomOfTheStackSymbol = automaton::AutomatonFromXMLParser::parseBottomOfTheStackSymbol<PushdownStoreSymbolType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > automaton(std::move(bottomOfTheStackSymbol)); + automaton.setStates(std::move(states)); + automaton.setCallInputAlphabet(std::move(callInputAlphabet)); + automaton.setReturnInputAlphabet(std::move(returnInputAlphabet)); + automaton.setLocalInputAlphabet(std::move(localInputAlphabet)); + automaton.setPushdownStoreAlphabet(std::move(stackSymbols)); + automaton.setInitialStates(std::move(initialStates)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton) { + if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol < InputSymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + PushdownStoreSymbolType push = automaton::AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); + + automaton.addCallTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(push)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "callTransition"); + } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol < InputSymbolType > ( input ); + PushdownStoreSymbolType pop = automaton::AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addReturnTransition(std::move(from), std::move(inputSymbol), std::move(pop), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "returnTransition"); + } else { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + InputSymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol < InputSymbolType > ( input ); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + + automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "localTransition"); + } +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::compose ( ext::deque < sax::Token > & out, const automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeCallInputAlphabet(out, automaton.getCallInputAlphabet()); + automaton::AutomatonToXMLComposer::composeReturnInputAlphabet(out, automaton.getReturnInputAlphabet()); + automaton::AutomatonToXMLComposer::composeLocalInputAlphabet(out, automaton.getLocalInputAlphabet()); + automaton::AutomatonToXMLComposer::composePushdownStoreAlphabet(out, automaton.getPushdownStoreAlphabet()); + automaton::AutomatonToXMLComposer::composeInitialStates(out, automaton.getInitialStates()); + automaton::AutomatonToXMLComposer::composeBottomOfTheStackSymbol(out, automaton.getBottomOfTheStackSymbol()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions ( out, automaton ); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class InputSymbolType, class PushdownStoreSymbolType, class StateType > +void xmlApi < automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > >::composeTransitions(ext::deque<sax::Token>& out, const automaton::VisiblyPushdownNPDA < InputSymbolType, PushdownStoreSymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getCallTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("callTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target.first); + automaton::AutomatonToXMLComposer::composeTransitionSinglePush(out, target.second); + + out.emplace_back("callTransition", sax::Token::TokenType::END_ELEMENT); + } + } + for(const auto& transition : automaton.getReturnTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("returnTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, std::get<0>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, std::get<1>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionSinglePop(out, std::get<2>(transition.first)); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target); + + out.emplace_back("returnTransition", sax::Token::TokenType::END_ELEMENT); + } + } + for(const auto& transition : automaton.getLocalTransitions()) { + for(const auto& target: transition.second) { + out.emplace_back("localTransition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, target); + + out.emplace_back("localTransition", sax::Token::TokenType::END_ELEMENT); + } + } + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_VISIBLY_PUSHDOWN_NPDA_H_ */ diff --git a/alib2data/src/automaton/xml/TA/DFTA.cpp b/alib2data/src/automaton/xml/TA/DFTA.cpp new file mode 100644 index 0000000000..4139df7ab2 --- /dev/null +++ b/alib2data/src/automaton/xml/TA/DFTA.cpp @@ -0,0 +1,22 @@ +/* + * DFTA.cpp + * + * Created on: Apr 14, 2015 + * Author: Stepan Plachy + */ + +#include "DFTA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::DFTA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::DFTA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::DFTA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::DFTA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/TA/DFTA.h b/alib2data/src/automaton/xml/TA/DFTA.h new file mode 100644 index 0000000000..46e60daa8b --- /dev/null +++ b/alib2data/src/automaton/xml/TA/DFTA.h @@ -0,0 +1,143 @@ +/* + * DFTA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Apr 14, 2015 + * Author: Stepan Plachy + */ + +#ifndef _XML_DFTA_H_ +#define _XML_DFTA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/TA/DFTA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class RankType, class StateType > +struct xmlApi < automaton::DFTA < SymbolType, RankType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "DFTA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::DFTA < SymbolType, RankType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::DFTA < SymbolType, RankType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::DFTA < SymbolType, RankType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::DFTA < SymbolType, RankType, StateType > & automaton ); +}; + +template<class SymbolType, class RankType, class StateType > +automaton::DFTA < SymbolType, RankType, StateType > xmlApi < automaton::DFTA < SymbolType, RankType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<common::ranked_symbol < SymbolType, RankType >> inputSymbols = automaton::AutomatonFromXMLParser::parseRankedInputAlphabet<common::ranked_symbol < SymbolType, RankType >>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::DFTA < SymbolType, RankType, StateType > automaton; + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template<class SymbolType, class RankType, class StateType > +void xmlApi < automaton::DFTA < SymbolType, RankType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::DFTA < SymbolType, RankType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + common::ranked_symbol < SymbolType, RankType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<common::ranked_symbol < SymbolType, RankType >>(input); + ext::vector<StateType> from = automaton::AutomatonFromXMLParser::parseTransitionFromMultiple<StateType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(inputSymbol), std::move(from), std::move(to)); +} + +template<class SymbolType, class RankType, class StateType > +void xmlApi < automaton::DFTA < SymbolType, RankType, StateType > >::compose(ext::deque<sax::Token>& out, const automaton::DFTA < SymbolType, RankType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeRankedInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template<class SymbolType, class RankType, class StateType > +void xmlApi < automaton::DFTA < SymbolType, RankType, StateType > >::composeTransitions(ext::deque<sax::Token>& out, const automaton::DFTA < SymbolType, RankType, StateType > & automaton ) { + out.emplace_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); + for(const auto& transition : automaton.getTransitions()) { + out.emplace_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); + + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, transition.second); + + out.emplace_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); + } + + out.emplace_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); +} + +} /* namespace core */ + +#endif /* _XML_DFTA_H_ */ diff --git a/alib2data/src/automaton/xml/TA/NFTA.cpp b/alib2data/src/automaton/xml/TA/NFTA.cpp new file mode 100644 index 0000000000..f85fdf0479 --- /dev/null +++ b/alib2data/src/automaton/xml/TA/NFTA.cpp @@ -0,0 +1,22 @@ +/* + * NFTA.cpp + * + * Created on: Mar 21, 2015 + * Author: Stepan Plachy + */ + +#include "NFTA.h" +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::NFTA < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::NFTA < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::NFTA < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::NFTA < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/TA/NFTA.h b/alib2data/src/automaton/xml/TA/NFTA.h new file mode 100644 index 0000000000..4166d3aa05 --- /dev/null +++ b/alib2data/src/automaton/xml/TA/NFTA.h @@ -0,0 +1,145 @@ +/* + * NFTA.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Mar 21, 2015 + * Author: Stepan Plachy + */ + +#ifndef _XML_NFTA_H_ +#define _XML_NFTA_H_ + +#include <core/xmlApi.hpp> +#include <automaton/TA/NFTA.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class RankType, class StateType > +struct xmlApi < automaton::NFTA < SymbolType, RankType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "NFTA"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::NFTA < SymbolType, RankType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::NFTA < SymbolType, RankType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::NFTA < SymbolType, RankType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::NFTA < SymbolType, RankType, StateType > & automaton ); +}; + +template < class SymbolType, class RankType, class StateType > +automaton::NFTA < SymbolType, RankType, StateType > xmlApi < automaton::NFTA < SymbolType, RankType, StateType > >::parse(ext::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<common::ranked_symbol < SymbolType, RankType >> inputSymbols = automaton::AutomatonFromXMLParser::parseRankedInputAlphabet<common::ranked_symbol < SymbolType, RankType >>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::NFTA < SymbolType, RankType, StateType > automaton; + automaton.setStates(std::move(states)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template < class SymbolType, class RankType, class StateType > +void xmlApi < automaton::NFTA < SymbolType, RankType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::NFTA < SymbolType, RankType, StateType > & automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + common::ranked_symbol < SymbolType, RankType > inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<common::ranked_symbol < SymbolType, RankType >>(input); + ext::vector<StateType> from = automaton::AutomatonFromXMLParser::parseTransitionFromMultiple<StateType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(inputSymbol), std::move(from), std::move(to)); +} + +template < class SymbolType, class RankType, class StateType > +void xmlApi < automaton::NFTA < SymbolType, RankType, StateType > >::compose(ext::deque<sax::Token>& out, const automaton::NFTA < SymbolType, RankType, StateType > & automaton ) { + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeRankedInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType, class RankType, class StateType > +void xmlApi < automaton::NFTA < SymbolType, RankType, StateType > >::composeTransitions(ext::deque<sax::Token>& out, const automaton::NFTA < SymbolType, RankType, StateType > & automaton ) { + out.emplace_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT)); + for(const auto& transition : automaton.getTransitions()) { + for(const auto& targetState: transition.second) { + out.emplace_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT)); + + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, targetState); + + out.emplace_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT)); + } + } + + out.emplace_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT)); +} + +} /* namespace core */ + +#endif /* _XML_NFTA_H_ */ diff --git a/alib2data/src/automaton/xml/TM/OneTapeDTM.cpp b/alib2data/src/automaton/xml/TM/OneTapeDTM.cpp new file mode 100644 index 0000000000..662db3b034 --- /dev/null +++ b/alib2data/src/automaton/xml/TM/OneTapeDTM.cpp @@ -0,0 +1,23 @@ +/* + * OneTapeDTM.cpp + * + * Created on: Apr 24, 2013 + * Author: Jan Travnicek + */ + +#include "OneTapeDTM.h" + +#include <automaton/Automaton.h> +#include <object/Object.h> + +#include <registration/XmlRegistration.hpp> + +namespace { + +static auto xmlWrite = registration::XmlWriterRegister < automaton::OneTapeDTM < > > ( ); +static auto xmlRead = registration::XmlReaderRegister < automaton::OneTapeDTM < > > ( ); + +static auto xmlGroup1 = registration::XmlRegisterTypeInGroup < automaton::Automaton, automaton::OneTapeDTM < > > ( ); +static auto xmlGroup2 = registration::XmlRegisterTypeInGroup < object::Object, automaton::OneTapeDTM < > > ( ); + +} /* namespace */ diff --git a/alib2data/src/automaton/xml/TM/OneTapeDTM.h b/alib2data/src/automaton/xml/TM/OneTapeDTM.h new file mode 100644 index 0000000000..c8fcff800c --- /dev/null +++ b/alib2data/src/automaton/xml/TM/OneTapeDTM.h @@ -0,0 +1,155 @@ +/* + * OneTapeDTM.h + * + * This file is part of Algorithms library toolkit. + * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz) + + * Algorithms library toolkit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * Algorithms library toolkit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>. + * + * Created on: Apr 24, 2013 + * Author: Martin Zak + * Author: Jan Travnicek + */ + +#ifndef _XML_ONE_TAPE_DTM_H_ +#define _XML_ONE_TAPE_DTM_H_ + +#include <core/xmlApi.hpp> +#include <automaton/TM/OneTapeDTM.h> +#include "../common/AutomatonFromXMLParser.h" +#include "../common/AutomatonToXMLComposer.h" + +namespace core { + +template < class SymbolType, class StateType > +struct xmlApi < automaton::OneTapeDTM < SymbolType, StateType > > { + /** + * \brief The XML tag name of class. + * + * \details Intentionaly a static member function to be safe in the initialisation before the main function starts. + * + * \returns string representing the XML tag name of the class + */ + static const std::string & xmlTagName() { + static std::string xmlTagName = "OneTapeDTM"; + + return xmlTagName; + } + + /** + * Parsing from a sequence of xml tokens helper. + * + * \params input the iterator to sequence of xml tokens to parse from + * + * \returns the new instance of the automaton + */ + static automaton::OneTapeDTM < SymbolType, StateType > parse ( ext::deque < sax::Token >::iterator & input ); + + /** + * Helper for parsing of individual transitions of the automaton from a sequence of xml tokens. + * + * \params input the iterator to sequence of xml tokens to parse from + * \params automaton the automaton to add the rule to + */ + static void parseTransition ( ext::deque < sax::Token >::iterator & input, automaton::OneTapeDTM < SymbolType, StateType > & automaton ); + + /** + * Composing to a sequence of xml tokens helper. + * + * \param out the sink for new xml tokens representing the automaton + * \param automaton the automaton to compose + */ + static void compose ( ext::deque < sax::Token > & out, const automaton::OneTapeDTM < SymbolType, StateType > & automaton ); + + /** + * Helper for composing transitions of the automaton to a sequence of xml tokens. + * + * \param out the sink for xml tokens representing the rules of the automaton + * \param automaton the automaton to compose + */ + static void composeTransitions ( ext::deque < sax::Token > & out, const automaton::OneTapeDTM < SymbolType, StateType > & automaton ); +}; + +template < class SymbolType, class StateType > +automaton::OneTapeDTM < SymbolType, StateType > xmlApi < automaton::OneTapeDTM < SymbolType, StateType > >::parse ( ext::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) ); + + ext::set<StateType> states = automaton::AutomatonFromXMLParser::parseStates<StateType>(input); + ext::set<SymbolType> tapeSymbols = automaton::AutomatonFromXMLParser::parseTapeAlphabet<SymbolType>(input); + ext::set<SymbolType> inputSymbols = automaton::AutomatonFromXMLParser::parseInputAlphabet<SymbolType>(input); + SymbolType blank = automaton::AutomatonFromXMLParser::parseBlankSymbol<SymbolType>(input); + StateType initialState = automaton::AutomatonFromXMLParser::parseInitialState<StateType>(input); + ext::set<StateType> finalStates = automaton::AutomatonFromXMLParser::parseFinalStates<StateType>(input); + + automaton::OneTapeDTM < SymbolType, StateType > automaton(std::move(initialState), std::move(blank)); + automaton.setStates(std::move(states)); + automaton.setTapeAlphabet(std::move(tapeSymbols)); + automaton.setInputAlphabet(std::move(inputSymbols)); + automaton.setFinalStates(std::move(finalStates)); + + automaton::AutomatonFromXMLParser::parseTransitions ( input, automaton ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) ); + return automaton; +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::OneTapeDTM < SymbolType, StateType > >::parseTransition(ext::deque<sax::Token>::iterator& input, automaton::OneTapeDTM<SymbolType, StateType>& automaton) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); + StateType from = automaton::AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); + SymbolType inputSymbol = automaton::AutomatonFromXMLParser::parseTransitionInputSymbol<SymbolType>(input); + StateType to = automaton::AutomatonFromXMLParser::parseTransitionTo<StateType>(input); + SymbolType outputSymbol = automaton::AutomatonFromXMLParser::parseTransitionOutputSymbol<SymbolType>(input); + automaton::Shift shift = automaton::AutomatonFromXMLParser::parseTransitionShift(input); + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transition"); + + automaton.addTransition(std::move(from), std::move(inputSymbol), std::move(to), std::move(outputSymbol), shift); +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::OneTapeDTM < SymbolType, StateType > >::compose(ext::deque<sax::Token>& out, const automaton::OneTapeDTM < SymbolType, StateType > & automaton ) { + out.emplace_back ( xmlTagName(), sax::Token::TokenType::START_ELEMENT ); + + automaton::AutomatonToXMLComposer::composeStates(out, automaton.getStates()); + automaton::AutomatonToXMLComposer::composeTapeAlphabet(out, automaton.getTapeAlphabet()); + automaton::AutomatonToXMLComposer::composeInputAlphabet(out, automaton.getInputAlphabet()); + automaton::AutomatonToXMLComposer::composeBlankSymbol(out, automaton.getBlankSymbol()); + automaton::AutomatonToXMLComposer::composeInitialState(out, automaton.getInitialState()); + automaton::AutomatonToXMLComposer::composeFinalStates(out, automaton.getFinalStates()); + composeTransitions(out, automaton); + + out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +template<class SymbolType, class StateType > +void xmlApi < automaton::OneTapeDTM < SymbolType, StateType > >::composeTransitions(ext::deque<sax::Token>& out, const automaton::OneTapeDTM < SymbolType, StateType > & automaton ) { + out.emplace_back("transitions", sax::Token::TokenType::START_ELEMENT); + for(const auto& transition : automaton.getTransitions()) { + out.emplace_back("transition", sax::Token::TokenType::START_ELEMENT); + + automaton::AutomatonToXMLComposer::composeTransitionFrom(out, transition.first.first); + automaton::AutomatonToXMLComposer::composeTransitionInputSymbol(out, transition.first.second); + automaton::AutomatonToXMLComposer::composeTransitionTo(out, std::get<0>(transition.second)); + automaton::AutomatonToXMLComposer::composeTransitionOutputSymbol(out, std::get<1>(transition.second)); + automaton::AutomatonToXMLComposer::composeTransitionShift(out, std::get<2>(transition.second)); + + out.emplace_back("transition", sax::Token::TokenType::END_ELEMENT); + } + + out.emplace_back("transitions", sax::Token::TokenType::END_ELEMENT); +} + +} /* namespace core */ + +#endif /* _XML_ONE_TAPE_DTM_H_ */ diff --git a/alib2data/src/automaton/common/AutomatonFromXMLParser.h b/alib2data/src/automaton/xml/common/AutomatonFromXMLParser.h similarity index 99% rename from alib2data/src/automaton/common/AutomatonFromXMLParser.h rename to alib2data/src/automaton/xml/common/AutomatonFromXMLParser.h index 8198824f43..c1fba083b9 100644 --- a/alib2data/src/automaton/common/AutomatonFromXMLParser.h +++ b/alib2data/src/automaton/xml/common/AutomatonFromXMLParser.h @@ -8,6 +8,7 @@ #ifndef AUTOMATON_FROM_XML_PARSER_H_ #define AUTOMATON_FROM_XML_PARSER_H_ +#include <alib/deque> #include <alib/set> #include <alib/vector> #include <alib/variant> @@ -17,9 +18,9 @@ #include <sax/ParserException.h> #include <core/xmlApi.hpp> -#include "../../regexp/unbounded/UnboundedRegExpStructure.h" -#include <alphabet/RankedSymbol.h> -#include "Shift.h" +#include <regexp/xml/UnboundedRegExpStructure.h> +#include <alphabet/xml/RankedSymbol.h> +#include <automaton/common/Shift.h> namespace automaton { @@ -123,7 +124,7 @@ template<class T> void AutomatonFromXMLParser::parseTransitions(ext::deque<sax::Token>::iterator& input, T& automaton) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transitions"); while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - T::parseTransition(input, automaton); + core::xmlApi < T >::parseTransition(input, automaton); } sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "transitions"); } diff --git a/alib2data/src/automaton/common/AutomatonToXMLComposer.h b/alib2data/src/automaton/xml/common/AutomatonToXMLComposer.h similarity index 99% rename from alib2data/src/automaton/common/AutomatonToXMLComposer.h rename to alib2data/src/automaton/xml/common/AutomatonToXMLComposer.h index e02be6ecb1..9f18dfc8e4 100644 --- a/alib2data/src/automaton/common/AutomatonToXMLComposer.h +++ b/alib2data/src/automaton/xml/common/AutomatonToXMLComposer.h @@ -14,12 +14,11 @@ #include <alib/variant> #include <alib/map> -#include <sax/Token.h> #include <core/xmlApi.hpp> -#include "Shift.h" -#include "../../regexp/unbounded/UnboundedRegExpStructure.h" -#include <alphabet/RankedSymbol.h> +#include <regexp/xml/UnboundedRegExpStructure.h> +#include <alphabet/xml/RankedSymbol.h> +#include <automaton/common/Shift.h> namespace automaton { diff --git a/alib2data/src/indexes/stringology/FactorOracleAutomaton.h b/alib2data/src/indexes/stringology/FactorOracleAutomaton.h index 0f1956f158..d14f37f7e3 100644 --- a/alib2data/src/indexes/stringology/FactorOracleAutomaton.h +++ b/alib2data/src/indexes/stringology/FactorOracleAutomaton.h @@ -42,6 +42,7 @@ #include <alphabet/common/SymbolNormalize.h> #include <automaton/FSM/DFA.h> +#include <automaton/xml/FSM/DFA.h> namespace indexes { diff --git a/alib2data/src/indexes/stringology/SuffixAutomaton.h b/alib2data/src/indexes/stringology/SuffixAutomaton.h index 8cab4afabb..dc9aaa4534 100644 --- a/alib2data/src/indexes/stringology/SuffixAutomaton.h +++ b/alib2data/src/indexes/stringology/SuffixAutomaton.h @@ -42,6 +42,7 @@ #include <alphabet/common/SymbolNormalize.h> #include <automaton/FSM/DFA.h> +#include <automaton/xml/FSM/DFA.h> namespace indexes { diff --git a/alib2data/test-src/automaton/AutomatonTemplatesTest.cpp b/alib2data/test-src/automaton/AutomatonTemplatesTest.cpp index d047f916cd..faf2202361 100644 --- a/alib2data/test-src/automaton/AutomatonTemplatesTest.cpp +++ b/alib2data/test-src/automaton/AutomatonTemplatesTest.cpp @@ -4,6 +4,7 @@ #include "sax/SaxComposeInterface.h" #include "automaton/FSM/DFA.h" +#include "automaton/xml/FSM/DFA.h" #include "automaton/AutomatonException.h" diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp index 74a0eb1c79..d15c2219e2 100644 --- a/alib2data/test-src/automaton/AutomatonTest.cpp +++ b/alib2data/test-src/automaton/AutomatonTest.cpp @@ -7,12 +7,19 @@ #include "sax/SaxComposeInterface.h" #include "automaton/FSM/DFA.h" +#include "automaton/xml/FSM/DFA.h" #include "automaton/FSM/ExtendedNFA.h" +#include "automaton/xml/FSM/ExtendedNFA.h" #include "automaton/PDA/SinglePopDPDA.h" +#include "automaton/xml/PDA/SinglePopDPDA.h" #include "automaton/PDA/DPDA.h" +#include "automaton/xml/PDA/DPDA.h" #include "automaton/PDA/NPDA.h" +#include "automaton/xml/PDA/NPDA.h" #include "automaton/PDA/RealTimeHeightDeterministicNPDA.h" +#include "automaton/xml/PDA/RealTimeHeightDeterministicNPDA.h" #include "automaton/TA/NFTA.h" +#include "automaton/xml/TA/NFTA.h" #include "automaton/AutomatonException.h" -- GitLab