Skip to content
Snippets Groups Projects
Commit 5945a19b authored by Jan Trávníček's avatar Jan Trávníček
Browse files

Parsers of OneTapeDTM CompactNFA and ExtendedNFA

parent 89e18e11
No related branches found
No related tags found
No related merge requests found
......@@ -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 */
 
......@@ -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;
......
......@@ -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 */
......
......@@ -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 */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment