From 9cf49255fe2e211e08a61524e0ca78045f057be2 Mon Sep 17 00:00:00 2001 From: Martin Zak <zakmart1@fit.cvut.cz> Date: Sun, 17 Nov 2013 15:50:05 +0100 Subject: [PATCH] edits automaton creation --- acat/src/acat.cpp | 6 ++-- alib/src/AutomatonFactory.cpp | 65 +++++++++++++++++------------------ alib/src/AutomatonFactory.h | 16 ++++----- 3 files changed, 41 insertions(+), 46 deletions(-) diff --git a/acat/src/acat.cpp b/acat/src/acat.cpp index 866baceed8..5f7ab254b8 100644 --- a/acat/src/acat.cpp +++ b/acat/src/acat.cpp @@ -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); diff --git a/alib/src/AutomatonFactory.cpp b/alib/src/AutomatonFactory.cpp index 6eeb405a5c..dabb7b1010 100644 --- a/alib/src/AutomatonFactory.cpp +++ b/alib/src/AutomatonFactory.cpp @@ -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++; } diff --git a/alib/src/AutomatonFactory.h b/alib/src/AutomatonFactory.h index d7748f8c8a..06fae365e3 100644 --- a/alib/src/AutomatonFactory.h +++ b/alib/src/AutomatonFactory.h @@ -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); -- GitLab