diff --git a/alib2/src/automaton/AutomatonFromXMLParser.cpp b/alib2/src/automaton/AutomatonFromXMLParser.cpp index 6cb8129d328868da478c07d541fcf73f04cb8c8a..26a3da3e79d3e1fc8312ea9954c7abadbfbb3846 100644 --- a/alib2/src/automaton/AutomatonFromXMLParser.cpp +++ b/alib2/src/automaton/AutomatonFromXMLParser.cpp @@ -140,14 +140,42 @@ EpsilonNFA AutomatonFromXMLParser::parseEpsilonNFA(std::list<sax::Token>& input) CompactNFA AutomatonFromXMLParser::parseCompactNFA(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "CompactNFA"); + + std::set<State> states = parseStates(input); + std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input); + std::set<State> initialStates = parseInitialStates(input); + std::set<State> finalStates = parseFinalStates(input); + + CompactNFA automaton; + automaton.setStates(states); + automaton.setInputSymbols(inputSymbols); + automaton.setInitialStates(initialStates); + automaton.setFinalStates(finalStates); + + parseTransitions<CompactNFA>(input, automaton); popToken(input, sax::Token::TokenType::END_ELEMENT, "CompactNFA"); + return automaton; } ExtendedNFA AutomatonFromXMLParser::parseExtendedNFA(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "ExtendedNFA"); + std::set<State> states = parseStates(input); + std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input); + std::set<State> initialStates = parseInitialStates(input); + std::set<State> finalStates = parseFinalStates(input); + + ExtendedNFA automaton; + automaton.setStates(states); + automaton.setInputSymbols(inputSymbols); + automaton.setInitialStates(initialStates); + automaton.setFinalStates(finalStates); + + parseTransitions<ExtendedNFA>(input, automaton); + popToken(input, sax::Token::TokenType::END_ELEMENT, "ExtendedNFA"); + return automaton; } NPDA AutomatonFromXMLParser::parseNPDA(std::list<sax::Token>& input) const { @@ -178,13 +206,49 @@ NPDA AutomatonFromXMLParser::parseNPDA(std::list<sax::Token>& input) const { SinglePopNPDA AutomatonFromXMLParser::parseSinglePopNPDA(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopNPDA"); + std::set<State> states = parseStates(input); + std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input); + std::set<alphabet::Symbol> stackSymbols = parseStackAlphabet(input); + std::set<State> initialStates = parseInitialStates(input); + std::set<alphabet::Symbol> initialStackSymbols = parseInitialStackSymbols(input); + std::set<State> finalStates = parseFinalStates(input); + + SinglePopNPDA automaton; + automaton.setStates(states); + automaton.setInputSymbols(inputSymbols); + automaton.setStackSymbols(stackSymbols); + automaton.setInitialStates(initialStates); + automaton.setFinalStates(finalStates); + automaton.setInitialSymbols(initialStackSymbols); + + parseTransitions<SinglePopNPDA>(input, automaton); + popToken(input, sax::Token::TokenType::END_ELEMENT, "SinglePopNPDA"); + + return automaton; } OneTapeDTM AutomatonFromXMLParser::parseOneTapeDTM(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "OneTapeTM"); + std::set<State> states = parseStates(input); + std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input); + std::set<alphabet::Symbol> tapeSymbols = parseTapeAlphabet(input); + alphabet::Symbol blank = parseBlankSymbol(input); + State initialState = parseInitialState(input); + std::set<State> finalStates = parseFinalStates(input); + + OneTapeDTM automaton(initialState, blank); + automaton.setStates(states); + automaton.setInputSymbols(inputSymbols); + automaton.setTapeSymbols(tapeSymbols); + automaton.setInitialState(initialState); + automaton.setFinalStates(finalStates); + + parseTransitions<OneTapeDTM>(input, automaton); + popToken(input, sax::Token::TokenType::END_ELEMENT, "OneTapeTM"); + return automaton; } std::set<State> AutomatonFromXMLParser::parseStates(std::list<sax::Token> &input) const { @@ -313,6 +377,22 @@ void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, Epsil automaton.addTransition(from, inputVariant, to); } +void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, CompactNFA& automaton) const { + State from = parseTransitionFrom(input); + string::String inputString = parseTransitionInputString(input); + State to = parseTransitionTo(input); + + automaton.addTransition(from, inputString, to); +} + +void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, ExtendedNFA& automaton) const { + State from = parseTransitionFrom(input); + regexp::RegExp inputRegexp = parseTransitionInputRegexp(input); + State to = parseTransitionTo(input); + + automaton.addTransition(from, inputRegexp, to); +} + void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, NPDA& automaton) const { State from = parseTransitionFrom(input); std::variant<string::Epsilon, alphabet::Symbol> inputSymbol = parseTransitionInputEpsilonSymbol(input); @@ -323,6 +403,26 @@ void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, NPDA& automaton.addTransition(from, inputSymbol, pop, to, push); } +void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, SinglePopNPDA& automaton) const { + State from = parseTransitionFrom(input); + std::variant<string::Epsilon, alphabet::Symbol> inputSymbol = parseTransitionInputEpsilonSymbol(input); + State to = parseTransitionFrom(input); + alphabet::Symbol pop = parseTransitionSinglePop(input); + std::vector<alphabet::Symbol> push = parseTransitionPush(input); + + automaton.addTransition(from, inputSymbol, pop, to, push); +} + +void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, OneTapeDTM& automaton) const { + State from = parseTransitionFrom(input); + alphabet::Symbol inputSymbol = parseTransitionInputSymbol(input); + State to = parseTransitionFrom(input); + alphabet::Symbol outputSymbol = parseTransitionOutputSymbol(input); + Shift shift = parseTransitionShift(input); + + automaton.addTransition(from, inputSymbol, to, outputSymbol, shift); +} + void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, UnknownAutomaton& automaton) const { UnknownTransition transition; @@ -392,6 +492,13 @@ std::vector<alphabet::Symbol> AutomatonFromXMLParser::parseTransitionPop(std::li return pops; } +alphabet::Symbol AutomatonFromXMLParser::parseTransitionSinglePop(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "pop"); + alphabet::Symbol pop = alib::FromXMLParsers::symbolParser.parse(input); + popToken(input, sax::Token::TokenType::END_ELEMENT, "pop"); + return pop; +} + std::vector<alphabet::Symbol> AutomatonFromXMLParser::parseTransitionPush(std::list<sax::Token>& input) const { std::vector<alphabet::Symbol> pushes; popToken(input, sax::Token::TokenType::START_ELEMENT, "push"); @@ -450,5 +557,19 @@ std::variant<string::Epsilon, alphabet::Symbol> AutomatonFromXMLParser::parseTra return result; } +string::String AutomatonFromXMLParser::parseTransitionInputString(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "input"); + string::String result(alib::FromXMLParsers::stringParser.parse(input)); + popToken(input, sax::Token::TokenType::END_ELEMENT, "input"); + return result; +} + +regexp::RegExp AutomatonFromXMLParser::parseTransitionInputRegexp(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "input"); + regexp::RegExp result(alib::FromXMLParsers::regexpParser.parse(input)); + popToken(input, sax::Token::TokenType::END_ELEMENT, "input"); + return result; +} + } /* namespace automaton */ diff --git a/alib2/src/automaton/AutomatonFromXMLParser.h b/alib2/src/automaton/AutomatonFromXMLParser.h index 7704c1adbca493b106d0f20c06e5df86a5708915..24e135f2f937bb971a359b919f7e0acf662b2f3c 100644 --- a/alib2/src/automaton/AutomatonFromXMLParser.h +++ b/alib2/src/automaton/AutomatonFromXMLParser.h @@ -48,6 +48,7 @@ protected: State parseTransitionTo(std::list<sax::Token>& input) const; Shift parseTransitionShift(std::list<sax::Token>& input) const; std::vector<alphabet::Symbol> parseTransitionPop(std::list<sax::Token>& input) const; + alphabet::Symbol parseTransitionSinglePop(std::list<sax::Token>& input) const; std::vector<alphabet::Symbol> parseTransitionPush(std::list<sax::Token>& input) const; template<class T> @@ -59,10 +60,15 @@ protected: void parseTransition(std::list<sax::Token>& input, CompactNFA& automaton) const; void parseTransition(std::list<sax::Token>& input, ExtendedNFA& automaton) const; void parseTransition(std::list<sax::Token>& input, NPDA& automaton) const; + void parseTransition(std::list<sax::Token>& input, SinglePopNPDA& automaton) const; + void parseTransition(std::list<sax::Token>& input, OneTapeDTM& automaton) const; alphabet::Symbol parseTransitionInputSymbol(std::list<sax::Token> &input) const; std::variant<string::Epsilon, alphabet::Symbol> parseTransitionInputEpsilonSymbol(std::list<sax::Token> &input) const; std::variant<string::Epsilon, alphabet::Symbol> parseTransitionInputBlankEpsilonSymbol(std::list<sax::Token> &input) const; + string::String parseTransitionInputString(std::list<sax::Token> &input) const; + regexp::RegExp parseTransitionInputRegexp(std::list<sax::Token> &input) const; + alphabet::Symbol parseTransitionOutputSymbol(std::list<sax::Token> &input) const; std::variant<string::Epsilon, alphabet::Symbol> parseTransitionOutputEpsilonSymbol(std::list<sax::Token> &input) const; std::variant<string::Epsilon, alphabet::Symbol> parseTransitionOutputBlankEpsilonSymbol(std::list<sax::Token> &input) const; diff --git a/alib2/src/regexp/RegExpFromXMLParser.h b/alib2/src/regexp/RegExpFromXMLParser.h index 2fa7c7e846927dcab6850b09c7d23d563deeffdc..0d8cb5f87602ce036fe21ad0dd4d059e28a157b6 100644 --- a/alib2/src/regexp/RegExpFromXMLParser.h +++ b/alib2/src/regexp/RegExpFromXMLParser.h @@ -15,6 +15,12 @@ #include "../sax/Token.h" #include "../alphabet/Symbol.h" +namespace automaton { + +class AutomatonFromXMLParser; + +} /* namespace automaton */ + namespace regexp { /** @@ -35,6 +41,8 @@ class RegExpFromXMLParser : public alib::FromXMLParser<RegExp, FEATURES> { virtual RegExp parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const; public: virtual bool first(std::list<sax::Token>& input) const; + + friend class automaton::AutomatonFromXMLParser; }; } /* namespace regexp */ diff --git a/alib2/src/string/StringFromXMLParser.h b/alib2/src/string/StringFromXMLParser.h index 8c45a48670da0cfb81013e88baf542e31df31710..abd34b58ff68e56a3eef7cd80cf862d90571f336 100644 --- a/alib2/src/string/StringFromXMLParser.h +++ b/alib2/src/string/StringFromXMLParser.h @@ -16,6 +16,12 @@ #include "../sax/Token.h" #include "../alphabet/Symbol.h" +namespace automaton { + +class AutomatonFromXMLParser; + +} /* namespace automaton */ + namespace string { /** @@ -30,6 +36,8 @@ class StringFromXMLParser : public alib::FromXMLParser<String, FEATURES> { virtual String parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const; public: virtual bool first(std::list<sax::Token>& input) const; + + friend class automaton::AutomatonFromXMLParser; }; } /* namespace string */