diff --git a/alib2algo/src/regexp/properties/RegExpEmpty.h b/alib2algo/src/regexp/properties/RegExpEmpty.h index 393e5a40f9910f1e4f3facd77e2083f4384b27bc..33351c47136e7438898b1beae2abcdf83b44fe9f 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 ca66c89127ac8b09fd196c1e9a24887326dafb2f..95c26996c51c67c5604db2018e7ef4a35341336a 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 b162b11fe7e3bb64c9c88a8f8033ec055c7e3c4b..a576e80e525544cfd56b93cfd44b884c0f714e5b 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 9529fb02a8ce1ccee538e524e731527749666069..78b355993982dad368103982b3a80b687c67cb4d 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 a401602628de97365129ad09fc5217bc66c0837f..5c5ef48446db3c242be7e92c78440c3279ccff35 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 3724d787f4b958cc83cef8a20d63724a5660e00d..42de0344f9c9551588832e6eac07e56f139647a3 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 7e3a84f688d5ee634d95b3d06d43679c8964e6f8..f23df78b19bbb92cdfa6a6b5f8a131a4c7c25c2c 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 5e7fbe08f52341653a206dd6eb336ba77ffe4028..abbe2f723a1a1195cf3cf91a01fd1e925506c223 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 afbbeae20514347b8067fc65676086aaaba6dbad..d02a3c8dbf18a70154a03668d5a616f59183982d 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 a836c7d7e1cb1dc8efb89dd222e7942322df06a5..f0b7e8708690ea8f17566bc886d2c5d38545342f 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 ce8d8d3d6e0123cbc1d7c1986a8f5b9d369c8e00..990f48493d06aab238aaf84305cbead65095057c 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 e1816b9471aad2319a52f5de2a02fc0d6281b5fe..949d630b5997d295c275185e2e21c17fd983e164 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 8426965a0f9caed093db3cc8f6209860d86aa208..a1bd29f7647131382f5db297397a9fc156c95845 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 92d3b3f36f57dfde6157b4a4a58ef9b4544b2eb7..128cc9a2a9ab8b95ba01f945f6af4dbce56f70f5 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 552f2d4155f0292e7078939e1f36f26ef000ec73..b49a674bcef79169d4886e4eb5ca8c87e4d9619e 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 d27f4f0708e7868e484ba327db8169cb6cba0b33..214bb826ce210c3a86549abfacb5450c8572672b 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 98b4ffe0277a187df2008dd522f085aa85f21d21..4c889af6191c57e70c7d903d711594a0c28b9e19 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 60177fccedec3039673287cbc7e6d77fda44b828..56e1c86fe7d44212efc9e98fb7f69135d771de58 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 4d59f970d7c32efff1cfe29f09ebed79877e847a..ad402cec476e87469119e30508bd51acaf0d33b5 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 f87e4c7015ba9dae89c90df0ccd46aaf584779dc..8dda09be0a30fb71b177d12fa1f607d4953af310 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 7a20b116f1c892f44260b564e7528fbc3ab6ce5e..de4e7ee0493d0eff73a710e2b2798829c71de604 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 62931c5b42ce36ce182381a6180e16c6f11fa93b..2c2935e218571e397b3e250a289c50355f584921 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 5fd9304bf356c4d2feca167ca1d4f3c26c3d8677..9ecf921bc3e544c98d3161e90fdeae80bd83f18a 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 bcb52dbbb6829347186da63d3eef93b267467d2c..46fa9ac047ee7c399fd68b1369a486c696b5429d 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 9b70c87c10ee3ce12fd031156687744677ee35c1..48316e7b5efba2085afb41edd44f47f1730e662b 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 e2310f67bf0cc52d165b5cab7d3a47c239f98a2a..aeea0944f1018ad4256c77e8b1a070977b9d56c8 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 6dcf5efc574709f359319a57687b3aeaac3d0fc4..39cb3c0c86965e903fae8eb8311e7636bd5d2174 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 9c9e0cfe719cc30fa5861d8b378d18adbbe0bff8..281279c062db908d3b5a0d4d32ce5bd014ec6485 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 31a7ce1d1e58fb83381046f47692ac252a501785..75ce4762df9540fa1f08b73ab2728eeffd4e0a48 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 59e56a0c2f9039bd154f92e501f4d11691fc8b81..4e7acbc0548fb0d0a1360c9270a851b47c943688 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 a41be410576192a0766e14f52c0f89454ff87f49..6c17b30ce770c61c0b820183c5caddec60c683ef 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 5755a26f7d7cdd4a7b510b319da6c9fde518adbe..459170336ee246a203f45215b207e80724483a79 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 29e565dc4adc4aec230f94b169a3732f757b29c3..ab4db62db6e684fdfe0eb198ea59ea92fc807956 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 73392c0dc514c6685ab811ae50118b469f2e7ca0..3ec9017c3b41eec5034cbe59340899fd98212e05 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 b3a90d980530d48dfca242bc7d0bfe76afd49736..0c59c0395838ed76d7dfee7872fbd94a069fe3b1 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 e2a677b6209c8e17884e3011e07840a045df8885..e642b41f9f761bd236800e283814d3058ef3c3df 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 6338e0ebb2c3c65443b0e0260abaa7e3c00bba59..0c1353aa1601f985dfef0da3f3dfa20f7686b8e1 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 e466e12e87742afaf2ad34cbc183fafbede30089..877eae325ab61a5fa9e92e577f4343babc3ffe8f 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 555cad4ccb9249fe560f278e328911d1ad3c48f7..f7713484b440004514c69db10d3a4f2e80585cc0 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 a337340d8c55e7a4851c75b875734da66042e6d5..197ba418ad9effdf27d3ce2f465c68418c82bcdb 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 e3d385fc4b494077f3e8893e0f3f4e25067ce9e5..da47c080f654908e0d53b810d276cb95183cbbfd 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 859e2c5cfda65a425bfb87f1a9dd23f19b4a968c..8f82a1102f931c705956eaed1ef2263af1d07267 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 7711dc4bcba776018913d046d4f6e39d9d6d1061..5d10fd850de7d416ac96fbfc095bc7b325322079 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 b1b1a2728d07fcd8fe6b7fb328f846894072e5c2..3e60b20eba8b9bcb2858784e68e434e5ef638140 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/alib2data/src/automaton/xml/Counter/TwoCounter.h b/alib2data/src/automaton/xml/Counter/TwoCounter.h new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/alib2data/src/automaton/xml/FSM/CompactNFA.cpp b/alib2data/src/automaton/xml/FSM/CompactNFA.cpp new file mode 100644 index 0000000000000000000000000000000000000000..494a5f29b43854923cc88f2e2ce628e5f46b87eb --- /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 0000000000000000000000000000000000000000..c99bf875393db42f95113f8152c054fdb9711f60 --- /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 0000000000000000000000000000000000000000..5e4b221aeb21cb9ffb3265bbba497f81f3a52386 --- /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 0000000000000000000000000000000000000000..906a4d7df999421a3308674cc25392744ea3240f --- /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 0000000000000000000000000000000000000000..a0629ecd9801e400c098cd5dfc13a7f07c24c7d1 --- /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 0000000000000000000000000000000000000000..dac7d62d03b02ffda2b4401e3ee00e651f51ffeb --- /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 0000000000000000000000000000000000000000..94554666ccd99aeee7b138e935d7cf13d3ec992b --- /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 0000000000000000000000000000000000000000..9d7c6ae98890b08114f7b0d5e513414600f6db34 --- /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 0000000000000000000000000000000000000000..ba115fd0596b69ea657141e5599127a0b7765c24 --- /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 0000000000000000000000000000000000000000..c464b9ef9faebb82eefbf0b101b770079ea880a2 --- /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 0000000000000000000000000000000000000000..ccb9be9263a98949eaf825911bf27e327e8ebd7c --- /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 0000000000000000000000000000000000000000..53408aae1e4f516b03c9e6090e421034b149c8d6 --- /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 0000000000000000000000000000000000000000..4810abfd5a7d8501c5b5b5522bdc7fd2b41b6661 --- /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 0000000000000000000000000000000000000000..925f19cb35a3c3fc3ce78d3ac5baf84797cde1ff --- /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 0000000000000000000000000000000000000000..af173af811809016ed6e08ff51728d2e9138cd8f --- /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 0000000000000000000000000000000000000000..0c86ce798daa486447fec77eb7c9a31bd5741be2 --- /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 0000000000000000000000000000000000000000..6516c331130e7279b4a0225029f8148c00a19906 --- /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 0000000000000000000000000000000000000000..61512f78fc6a9b6de6ff8c5eb44d51502e4a3695 --- /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 0000000000000000000000000000000000000000..52f6431c7ff1cdc50ee6a1ebfdebfe28ed066b7e --- /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 0000000000000000000000000000000000000000..bd331edc9c62417f9dbed9c804dfe61d2c008f17 --- /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 0000000000000000000000000000000000000000..b854540f52433629a73af86d30c801b5f70c673c --- /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 0000000000000000000000000000000000000000..bd1bca13b95d0e79fb3b0876ddf750e9065deb37 --- /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 0000000000000000000000000000000000000000..fadda2739a67eb659cb4e780f570c82f720ad9d2 --- /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 0000000000000000000000000000000000000000..d05dc25fbdc8429aba10b9d1b137576eef44ce00 --- /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 0000000000000000000000000000000000000000..488c9831e015ded4f772f6fc6d49b56449efd525 --- /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 0000000000000000000000000000000000000000..9e80f3317d0725a64fdf69404c43f88a0cdf0079 --- /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 0000000000000000000000000000000000000000..f45ed52b797cb4ac44084bdce1a992f08f7ac683 --- /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 0000000000000000000000000000000000000000..328476b1580424ace22e7338bce7328b9698b87a --- /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 0000000000000000000000000000000000000000..a6d858975a24613b30611f730cdabcc5dee40e48 --- /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 0000000000000000000000000000000000000000..f9d924986ae96b4c867a2f77016faea6507b56bc --- /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 0000000000000000000000000000000000000000..850d62c103ccf96fef57d0c9d1dae37b2f1bc327 --- /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 0000000000000000000000000000000000000000..84f4ae5b4828de3311646f7a68041bbdd78b3f36 --- /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 0000000000000000000000000000000000000000..e46ac9eb3a7ffa17b7443be6ea8d5ee2b1684b5b --- /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 0000000000000000000000000000000000000000..763bd142c66cfda350163c72123af8b0c859f26a --- /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 0000000000000000000000000000000000000000..4139df7ab22d5682f66d94ff2727e81f33b67b33 --- /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 0000000000000000000000000000000000000000..46e60daa8b8f2484618e6b3dbce14f648ffaaad9 --- /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 0000000000000000000000000000000000000000..f85fdf047937ab143d21a54dd26a80a3b9584aa9 --- /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 0000000000000000000000000000000000000000..4166d3aa05bfcacfd0544c98a687e7b7c784db6e --- /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 0000000000000000000000000000000000000000..662db3b034180182002d1670b7c7f433f4528249 --- /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 0000000000000000000000000000000000000000..c8fcff800ccdc0e0b5d48fccdd77dbd3e7921124 --- /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 8198824f4398b9e9534f74464025427a8e30d6ec..c1fba083b95c3e3caf0886e31f74a448c0511092 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 e02be6ecb1b327f67dd4185dfa1c2397496a80a8..9f18dfc8e43c787065bf330f196e3127a8639e82 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 0f1956f1582010e009a855cc6eece4cc5b0edbac..d14f37f7e379a0037217ffbdd87d6e4163b0e5a1 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 8cab4afabb87d5489fd911c02c94a39984c69c3d..dc9aaa4534fc41311c736812d78a741ab9dcd291 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 d047f916cde2e19697631bc41c293080624a7482..faf2202361b513a2bb77451305bd6c6c40ef714a 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 74a0eb1c799a68ca998db69cde3972ada92fe477..d15c2219e23f441836dc15c1285d76206c84f261 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"