Skip to content
Snippets Groups Projects
Commit 9cf49255 authored by Martin Žák's avatar Martin Žák
Browse files

edits automaton creation

parent f3a0582f
No related branches found
No related tags found
No related merge requests found
......@@ -44,10 +44,8 @@ int main(int argc, char** argv) {
}
 
if (tokens.front().getData() == "automaton") {
UnknownAutomaton unknownAutomaton = AutomatonParser::parse(tokens);
Automaton* automaton = AutomatonFactory::buildAutomaton(
&unknownAutomaton);
unknownAutomaton.toXML(cout);
UnknownAutomaton automaton = AutomatonParser::parse(tokens);
automaton.toXML(cout);
} else if (tokens.front().getData() == "grammar") {
UnknownGrammar grammar = GrammarParser::parse(tokens);
grammar.toXML(cout);
......
......@@ -35,47 +35,44 @@ UnknownAutomaton AutomatonFactory::parse(list<Token> tokens) {
return parser.parse(tokens);
}
 
Automaton* AutomatonFactory::buildAutomaton(UnknownAutomaton* automaton) {
Automaton* toReturn;
Automaton* AutomatonFactory::buildAutomaton(const UnknownAutomaton& automaton) {
if (isFSM(automaton)) {
toReturn = new FSM(buildFSM(automaton));
return new FSM(buildFSM(automaton));
} else if (isPDA(automaton)) {
toReturn = new PDA(buildPDA(automaton));
return new PDA(buildPDA(automaton));
} else if (isTM(automaton)) {
toReturn = new TM(buildTM(automaton));
return new TM(buildTM(automaton));
} else {
throw AutomatonException("Cannot determine automaton type.");
}
return toReturn;
}
 
void AutomatonFactory::buildCommon(Automaton& automaton, UnknownAutomaton* unknownAutomaton) {
void AutomatonFactory::buildCommon(Automaton& automaton,const UnknownAutomaton& unknownAutomaton) {
set<State>::const_iterator state;
set<Symbol>::const_iterator symbol;
 
const set<State>& states = unknownAutomaton->getStates();
const set<State>& states = unknownAutomaton.getStates();
state = states.begin();
while (state != states.end()) {
automaton.addState(*state);
state++;
}
 
const set<Symbol>& inputAlphabet = unknownAutomaton->getInputAlphabet();
const set<Symbol>& inputAlphabet = unknownAutomaton.getInputAlphabet();
symbol = inputAlphabet.begin();
while (symbol != inputAlphabet.end()) {
automaton.addInputSymbol(*symbol);
symbol++;
}
 
const set<State>& initialStates = unknownAutomaton->getInitialStates();
const set<State>& initialStates = unknownAutomaton.getInitialStates();
state = initialStates.begin();
while (state != initialStates.end()) {
automaton.addInitialState(*state);
state++;
}
 
const set<State>& finalStates = unknownAutomaton->getFinalStates();
const set<State>& finalStates = unknownAutomaton.getFinalStates();
state = finalStates.begin();
while (state != finalStates.end()) {
automaton.addFinalState(*state);
......@@ -83,13 +80,13 @@ void AutomatonFactory::buildCommon(Automaton& automaton, UnknownAutomaton* unkno
}
}
 
bool AutomatonFactory::isFSM(UnknownAutomaton* automaton) {
if (automaton->getStackAlphabet().size() > 0 || automaton->getStartSymbols().size() > 0
|| automaton->getTapeAlphabet().size() > 0 || automaton->getBlankSymbol() != Symbol("")) {
bool AutomatonFactory::isFSM(const UnknownAutomaton& automaton) {
if (automaton.getStackAlphabet().size() > 0 || automaton.getStartSymbols().size() > 0
|| automaton.getTapeAlphabet().size() > 0 || automaton.getBlankSymbol() != Symbol("")) {
return false;
}
 
const set<UnknownTransition> transitions = automaton->getTransitions();
const set<UnknownTransition> transitions = automaton.getTransitions();
set<UnknownTransition>::const_iterator it = transitions.begin();
while (it != transitions.end()) {
if (!isFSMTransition(*it)) {
......@@ -106,12 +103,12 @@ bool AutomatonFactory::isFSMTransition(const UnknownTransition& transition) {
|| transition.getShift() != NOT_SET);
}
 
FSM AutomatonFactory::buildFSM(UnknownAutomaton* automaton) {
FSM AutomatonFactory::buildFSM(const UnknownAutomaton& automaton) {
FSM fsm;
 
buildCommon(fsm, automaton);
 
const set<UnknownTransition> transitions = automaton->getTransitions();
const set<UnknownTransition> transitions = automaton.getTransitions();
set<UnknownTransition>::const_iterator transition = transitions.begin();
while (transition != transitions.end()) {
fsm.addTransition(transition->getFrom(), transition->getInput(), transition->getTo());
......@@ -121,12 +118,12 @@ FSM AutomatonFactory::buildFSM(UnknownAutomaton* automaton) {
return fsm;
}
 
bool AutomatonFactory::isPDA(UnknownAutomaton* automaton) {
if (automaton->getTapeAlphabet().size() > 0 || automaton->getBlankSymbol() != Symbol("")) {
bool AutomatonFactory::isPDA(const UnknownAutomaton& automaton) {
if (automaton.getTapeAlphabet().size() > 0 || automaton.getBlankSymbol() != Symbol("")) {
return false;
}
 
const set<UnknownTransition> transitions = automaton->getTransitions();
const set<UnknownTransition> transitions = automaton.getTransitions();
set<UnknownTransition>::const_iterator transition = transitions.begin();
while (transition != transitions.end()) {
if (!isPDATransition(*transition)) {
......@@ -142,20 +139,20 @@ bool AutomatonFactory::isPDATransition(const UnknownTransition& transition) {
return !(transition.getOutput() != Symbol("") || transition.getShift() != NOT_SET);
}
 
PDA AutomatonFactory::buildPDA(UnknownAutomaton* automaton) {
PDA AutomatonFactory::buildPDA(const UnknownAutomaton& automaton) {
PDA pda;
buildCommon(pda, automaton);
 
const set<Symbol>& stackAlphabet = automaton->getStackAlphabet();
const set<Symbol>& stackAlphabet = automaton.getStackAlphabet();
set<Symbol>::iterator stackSymbol = stackAlphabet.begin();
while (stackSymbol != stackAlphabet.end()) {
pda.addStackSymbol(*stackSymbol);
stackSymbol++;
}
 
pda.setStartSymbols(automaton->getStartSymbols());
pda.setStartSymbols(automaton.getStartSymbols());
 
const set<UnknownTransition>& transitions = automaton->getTransitions();
const set<UnknownTransition>& transitions = automaton.getTransitions();
 
set<UnknownTransition>::const_iterator transition = transitions.begin();
while (transition != transitions.end()) {
......@@ -168,12 +165,12 @@ PDA AutomatonFactory::buildPDA(UnknownAutomaton* automaton) {
return pda;
}
 
bool AutomatonFactory::isTM(UnknownAutomaton* automaton) {
if (automaton->getStackAlphabet().size() > 0 || automaton->getStartSymbols().size() > 0) {
bool AutomatonFactory::isTM(const UnknownAutomaton& automaton) {
if (automaton.getStackAlphabet().size() > 0 || automaton.getStartSymbols().size() > 0) {
return false;
}
 
const set<UnknownTransition>& transitions = automaton->getTransitions();
const set<UnknownTransition>& transitions = automaton.getTransitions();
 
set<UnknownTransition>::const_iterator transition = transitions.begin();
while (transition != transitions.end()) {
......@@ -192,10 +189,10 @@ bool AutomatonFactory::isTMTransition(const UnknownTransition& transition) {
 
}
 
TM AutomatonFactory::buildTM(UnknownAutomaton* automaton) {
TM AutomatonFactory::buildTM(const UnknownAutomaton& automaton) {
TM tm;
 
const set<Symbol>& tapeAlphabet = automaton->getTapeAlphabet();
const set<Symbol>& tapeAlphabet = automaton.getTapeAlphabet();
 
set<Symbol>::const_iterator tapeSymbol = tapeAlphabet.begin();
while (tapeSymbol != tapeAlphabet.end()) {
......@@ -205,14 +202,14 @@ TM AutomatonFactory::buildTM(UnknownAutomaton* automaton) {
 
buildCommon(tm, automaton);
 
tm.setBlankSymbol(automaton->getBlankSymbol());
tm.setBlankSymbol(automaton.getBlankSymbol());
 
const set<UnknownTransition>& transitions = automaton->getTransitions();
const set<UnknownTransition>& transitions = automaton.getTransitions();
 
set<UnknownTransition>::const_iterator transition = transitions.begin();
while (transition != transitions.end()) {
TransitionTM tr(transition->getFrom(), transition->getInput(), transition->getTo(),
transition->getOutput(), transition->getShift());
TransitionTM tr(transition->getFrom(), transition->getInput(), transition->getTo(), transition->getOutput(),
transition->getShift());
tm.addTransition(tr);
transition++;
}
......
......@@ -24,21 +24,21 @@ public:
static UnknownAutomaton fromFile(const string& filename);
static UnknownAutomaton fromString(const string& str);
 
static Automaton* buildAutomaton(UnknownAutomaton* automaton);
static Automaton* buildAutomaton(const UnknownAutomaton& automaton);
 
static bool isFSM(UnknownAutomaton* automaton);
static FSM buildFSM(UnknownAutomaton* automaton);
static bool isFSM(const UnknownAutomaton& automaton);
static FSM buildFSM(const UnknownAutomaton& automaton);
 
static bool isPDA(UnknownAutomaton* automaton);
static PDA buildPDA(UnknownAutomaton* automaton);
static bool isPDA(const UnknownAutomaton& automaton);
static PDA buildPDA(const UnknownAutomaton& automaton);
 
static bool isTM(UnknownAutomaton* automaton);
static TM buildTM(UnknownAutomaton* automaton);
static bool isTM(const UnknownAutomaton& automaton);
static TM buildTM(const UnknownAutomaton& automaton);
 
protected:
static UnknownAutomaton parse(list<sax::Token> tokens);
 
static void buildCommon(Automaton& automaton, UnknownAutomaton* unknownAutomaton);
static void buildCommon(Automaton& automaton, const UnknownAutomaton& unknownAutomaton);
 
static bool isFSMTransition(const UnknownTransition& transition);
static bool isPDATransition(const UnknownTransition& transition);
......
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