From c8a594e989dd5de8a92ece96924e9d519a518a07 Mon Sep 17 00:00:00 2001 From: Jan Vesely <janvesely@janvesely.net> Date: Fri, 21 Mar 2014 17:45:21 +0100 Subject: [PATCH] add abstract determinizer, use it in adeterminize --- adeterminize/src/Determinizer.h | 29 ++++++++++++ adeterminize/src/adeterminize.cpp | 45 +++++++------------ adeterminize/src/fsm/FsmDeterminizer.cpp | 2 +- adeterminize/src/fsm/FsmDeterminizer.h | 5 ++- adeterminize/src/idpda/IdpdaDeterminizer.cpp | 2 +- adeterminize/src/idpda/IdpdaDeterminizer.h | 5 ++- .../src/rhdpda/RhdpdaDeterminizer.cpp | 2 +- adeterminize/src/rhdpda/RhdpdaDeterminizer.h | 5 ++- .../src/rhdpda/RhdpdaDeterminizer2.cpp | 2 +- adeterminize/src/rhdpda/RhdpdaDeterminizer2.h | 5 ++- adeterminize/src/vpa/VpaDeterminizer.cpp | 2 +- adeterminize/src/vpa/VpaDeterminizer.h | 5 ++- adeterminize/src/vpa/VpaDeterminizer2.cpp | 2 +- adeterminize/src/vpa/VpaDeterminizer2.h | 5 ++- adeterminize/src/vpa/VpaDeterminizer3.cpp | 2 +- adeterminize/src/vpa/VpaDeterminizer3.h | 5 ++- 16 files changed, 72 insertions(+), 51 deletions(-) create mode 100644 adeterminize/src/Determinizer.h diff --git a/adeterminize/src/Determinizer.h b/adeterminize/src/Determinizer.h new file mode 100644 index 0000000000..84b61b2a71 --- /dev/null +++ b/adeterminize/src/Determinizer.h @@ -0,0 +1,29 @@ +#ifndef DETERMINIZER_H_ +#define DETERMINIZER_H_ + +#include "automaton/Automaton.h" + +using namespace std; +using namespace automaton; + +namespace determinization { + +/** + * Base class for all classes with determinization algorithms. + */ +class Determinizer +{ + + public: + + virtual ~Determinizer(); + + /** + * Runs determinization algorithm. + */ + virtual Automaton* determinize() = 0; + +}; + +} +#endif diff --git a/adeterminize/src/adeterminize.cpp b/adeterminize/src/adeterminize.cpp index 6e016dff33..be71c90a47 100644 --- a/adeterminize/src/adeterminize.cpp +++ b/adeterminize/src/adeterminize.cpp @@ -38,45 +38,28 @@ void printHelp() { } -Automaton* runFsmDeterminization(Automaton* automaton) { - fsm::FsmDeterminizer determinizer((FSM*) automaton); - return determinizer.determinize(); -} - - -Automaton* runIdpdaDeterminization(Automaton* automaton) { - idpda::IdpdaDeterminizer determinizer((PDA*) automaton); - return determinizer.determinize(); -} - - -Automaton* runVpaDeterminization(Automaton* automaton, string version) { +Determinizer* getVpaDeterminizer(Automaton* automaton, string version) { if (version == "3") { - vpa::VpaDeterminizer3 determinizer((PDA*) automaton); - return determinizer.determinize(); + return new vpa::VpaDeterminizer3((PDA*) automaton); } else if (version == "2") { - vpa::VpaDeterminizer2 determinizer((PDA*) automaton); - return determinizer.determinize(); + return new vpa::VpaDeterminizer2((PDA*) automaton); } - vpa::VpaDeterminizer determinizer((PDA*) automaton); - return determinizer.determinize(); + return new vpa::VpaDeterminizer((PDA*) automaton); } -Automaton* runRhdpdaDeterminization(Automaton* automaton, string version) { +Determinizer* getRhdpdaDeterminizer(Automaton* automaton, string version) { if (version == "2") { - rhdpda::RhdpdaDeterminizer2 determinizer((PDA*) automaton); - return determinizer.determinize(); + return new rhdpda::RhdpdaDeterminizer2((PDA*) automaton); } - rhdpda::RhdpdaDeterminizer determinizer((PDA*) automaton); - return determinizer.determinize(); + return new rhdpda::RhdpdaDeterminizer((PDA*) automaton); } -Automaton* runDeterminization(Automaton* automaton, string type, string version) { +Determinizer* getDeterminizer(Automaton* automaton, string type, string version) { string _type; for (const auto& c : type) { _type.append(1, tolower(c)); @@ -84,16 +67,16 @@ Automaton* runDeterminization(Automaton* automaton, string type, string version) type = _type; if (type == "fsm") { - return runFsmDeterminization(automaton); + return new fsm::FsmDeterminizer((FSM*) automaton); } else if (type == "idpda") { - return runIdpdaDeterminization(automaton); + return new idpda::IdpdaDeterminizer((PDA*) automaton); } else if (type == "vpa") { - return runVpaDeterminization(automaton, version); + return getVpaDeterminizer(automaton, version); } else if (type == "rhdpda") { - return runRhdpdaDeterminization(automaton, version); + return getRhdpdaDeterminizer(automaton, version); } throw AlibException("Unknown type of input automaton. See help."); @@ -134,11 +117,13 @@ int main(int argc, char** argv) { string input(istreambuf_iterator<char>(cin), (istreambuf_iterator<char>())); UnknownAutomaton unknownAutomaton = AutomatonFactory::fromString(input); Automaton* automaton = AutomatonFactory::buildAutomaton(unknownAutomaton); - Automaton* deterministicAutomaton = runDeterminization(automaton, type, version); + Determinizer* determinizer = getDeterminizer(automaton, type, version); + Automaton* deterministicAutomaton = determinizer->determinize(); deterministicAutomaton->toXML(cout); delete automaton; delete deterministicAutomaton; + delete determinizer; } catch (AlibException& e) { cout << e.what() << endl; diff --git a/adeterminize/src/fsm/FsmDeterminizer.cpp b/adeterminize/src/fsm/FsmDeterminizer.cpp index bc3bd5cf43..fbb12e7873 100644 --- a/adeterminize/src/fsm/FsmDeterminizer.cpp +++ b/adeterminize/src/fsm/FsmDeterminizer.cpp @@ -37,7 +37,7 @@ FsmDeterminizer::FsmDeterminizer(FSM* nfsm) } -FSM* FsmDeterminizer::determinize() +Automaton* FsmDeterminizer::determinize() { this->dfsm = new FSM(); this->initDeterminization(); diff --git a/adeterminize/src/fsm/FsmDeterminizer.h b/adeterminize/src/fsm/FsmDeterminizer.h index f40374aeca..81750bb6af 100644 --- a/adeterminize/src/fsm/FsmDeterminizer.h +++ b/adeterminize/src/fsm/FsmDeterminizer.h @@ -10,6 +10,7 @@ #include "automaton/FSM/TransitionFSM.h" #include "../common/Utils.h" +#include "../Determinizer.h" #include "FsmStructs.h" #include "FsmUtils.h" @@ -23,7 +24,7 @@ namespace fsm { /** * Class for running determinization algorithm on fsm. */ -class FsmDeterminizer +class FsmDeterminizer : public Determinizer { private: @@ -73,7 +74,7 @@ class FsmDeterminizer * * @return deterministic final-state machine */ - FSM* determinize(); + Automaton* determinize(); }; diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.cpp b/adeterminize/src/idpda/IdpdaDeterminizer.cpp index 965d0241c5..a5cc5a6437 100644 --- a/adeterminize/src/idpda/IdpdaDeterminizer.cpp +++ b/adeterminize/src/idpda/IdpdaDeterminizer.cpp @@ -41,7 +41,7 @@ IdpdaDeterminizer::IdpdaDeterminizer(PDA* automaton) } -PDA* IdpdaDeterminizer::determinize() +Automaton* IdpdaDeterminizer::determinize() { this->didpda = new PDA(); this->initDeterminization(); diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.h b/adeterminize/src/idpda/IdpdaDeterminizer.h index e32d6fa0a0..de7a0c1a4d 100644 --- a/adeterminize/src/idpda/IdpdaDeterminizer.h +++ b/adeterminize/src/idpda/IdpdaDeterminizer.h @@ -11,6 +11,7 @@ #include "automaton/PDA/TransitionPDA.h" #include "../common/Utils.h" +#include "../Determinizer.h" #include "../fsm/FsmUtils.h" #include "../fsm/FsmStructs.h" @@ -22,7 +23,7 @@ using namespace determinization::fsm; namespace determinization { namespace idpda { -class IdpdaDeterminizer +class IdpdaDeterminizer : public Determinizer { private: PDA* nidpda; @@ -36,7 +37,7 @@ class IdpdaDeterminizer public: IdpdaDeterminizer(PDA* automaton); - PDA* determinize(); + Automaton* determinize(); }; } diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp b/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp index 8b94bef76d..462a6c0e4d 100644 --- a/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp +++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp @@ -87,7 +87,7 @@ RhdpdaDeterminizer::RhdpdaDeterminizer(PDA* rhdpda) } -PDA* RhdpdaDeterminizer::determinize() +Automaton* RhdpdaDeterminizer::determinize() { const Symbol& BOTTOM_OF_STACK_SYMBOL = RhdpdaUtils::BOTTOM_OF_STACK_SYMBOL; diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer.h b/adeterminize/src/rhdpda/RhdpdaDeterminizer.h index 437f5cef95..45fe8707e1 100644 --- a/adeterminize/src/rhdpda/RhdpdaDeterminizer.h +++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer.h @@ -12,6 +12,7 @@ #include "alphabet/Symbol.h" #include "../common/Utils.h" +#include "../Determinizer.h" #include "RhdpdaUtils.h" #include "RhdpdaStructs.h" @@ -22,7 +23,7 @@ using namespace alphabet; namespace determinization { namespace rhdpda { -class RhdpdaDeterminizer +class RhdpdaDeterminizer : public Determinizer { private: PDA* rhdpda; @@ -45,7 +46,7 @@ class RhdpdaDeterminizer public: RhdpdaDeterminizer(PDA* rhdpda); - PDA* determinize(); + Automaton* determinize(); }; } diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp index 0e87dc3fee..f920255039 100644 --- a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp +++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp @@ -64,7 +64,7 @@ RhdpdaDeterminizer2::RhdpdaDeterminizer2(PDA* rhdpda) } -PDA* RhdpdaDeterminizer2::determinize() +Automaton* RhdpdaDeterminizer2::determinize() { const Symbol& BOTTOM_OF_STACK_SYMBOL = RhdpdaUtils::BOTTOM_OF_STACK_SYMBOL; diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h index 875bd94f2e..399c8bf806 100644 --- a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h +++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h @@ -12,6 +12,7 @@ #include "alphabet/Symbol.h" #include "../common/Utils.h" +#include "../Determinizer.h" #include "RhdpdaUtils.h" #include "RhdpdaStructs.h" @@ -23,7 +24,7 @@ using namespace determinization; namespace determinization { namespace rhdpda { -class RhdpdaDeterminizer2 +class RhdpdaDeterminizer2 : public Determinizer { private: PDA* rhdpda; @@ -45,7 +46,7 @@ class RhdpdaDeterminizer2 public: RhdpdaDeterminizer2(PDA* rhdpda); - PDA* determinize(); + Automaton* determinize(); }; } diff --git a/adeterminize/src/vpa/VpaDeterminizer.cpp b/adeterminize/src/vpa/VpaDeterminizer.cpp index 4259e91abe..fc32224df0 100644 --- a/adeterminize/src/vpa/VpaDeterminizer.cpp +++ b/adeterminize/src/vpa/VpaDeterminizer.cpp @@ -40,7 +40,7 @@ VpaDeterminizer::VpaDeterminizer(PDA* nvpa) } -PDA* VpaDeterminizer::determinize() +Automaton* VpaDeterminizer::determinize() { this->dvpa = new PDA(); this->initDeterminization(); diff --git a/adeterminize/src/vpa/VpaDeterminizer.h b/adeterminize/src/vpa/VpaDeterminizer.h index 8a81a78304..c2fa82ec00 100644 --- a/adeterminize/src/vpa/VpaDeterminizer.h +++ b/adeterminize/src/vpa/VpaDeterminizer.h @@ -11,6 +11,7 @@ #include "alphabet/Symbol.h" #include "../common/Utils.h" +#include "../Determinizer.h" #include "VpaUtils.h" #include "VpaStructs.h" @@ -22,7 +23,7 @@ using namespace determinization; namespace determinization { namespace vpa { -class VpaDeterminizer +class VpaDeterminizer : public Determinizer { private: PDA* nvpa; @@ -40,7 +41,7 @@ class VpaDeterminizer public: VpaDeterminizer(PDA* nvpa); - PDA* determinize(); + Automaton* determinize(); }; } diff --git a/adeterminize/src/vpa/VpaDeterminizer2.cpp b/adeterminize/src/vpa/VpaDeterminizer2.cpp index 2d0bbb3d1c..368c7aa708 100644 --- a/adeterminize/src/vpa/VpaDeterminizer2.cpp +++ b/adeterminize/src/vpa/VpaDeterminizer2.cpp @@ -40,7 +40,7 @@ VpaDeterminizer2::VpaDeterminizer2(PDA* nvpa) } -PDA* VpaDeterminizer2::determinize() +Automaton* VpaDeterminizer2::determinize() { this->dvpa = new PDA(); this->initDeterminization(); diff --git a/adeterminize/src/vpa/VpaDeterminizer2.h b/adeterminize/src/vpa/VpaDeterminizer2.h index b22d499884..b1ccab3e4d 100644 --- a/adeterminize/src/vpa/VpaDeterminizer2.h +++ b/adeterminize/src/vpa/VpaDeterminizer2.h @@ -11,6 +11,7 @@ #include "alphabet/Symbol.h" #include "../common/Utils.h" +#include "../Determinizer.h" #include "VpaUtils.h" #include "VpaStructs.h" @@ -22,7 +23,7 @@ using namespace determinization; namespace determinization { namespace vpa { -class VpaDeterminizer2 +class VpaDeterminizer2 : public Determinizer { private: PDA* nvpa; @@ -40,7 +41,7 @@ class VpaDeterminizer2 public: VpaDeterminizer2(PDA* nvpa); - PDA* determinize(); + Automaton* determinize(); }; } diff --git a/adeterminize/src/vpa/VpaDeterminizer3.cpp b/adeterminize/src/vpa/VpaDeterminizer3.cpp index 711b0f414a..c069e65998 100644 --- a/adeterminize/src/vpa/VpaDeterminizer3.cpp +++ b/adeterminize/src/vpa/VpaDeterminizer3.cpp @@ -106,7 +106,7 @@ VpaDeterminizer3::VpaDeterminizer3(PDA* nvpa) } -PDA* VpaDeterminizer3::determinize() +Automaton* VpaDeterminizer3::determinize() { this->dvpa = new PDA(); this->initDeterminization(); diff --git a/adeterminize/src/vpa/VpaDeterminizer3.h b/adeterminize/src/vpa/VpaDeterminizer3.h index ead10b7d19..4c5574ef28 100644 --- a/adeterminize/src/vpa/VpaDeterminizer3.h +++ b/adeterminize/src/vpa/VpaDeterminizer3.h @@ -11,6 +11,7 @@ #include "alphabet/Symbol.h" #include "../common/Utils.h" +#include "../Determinizer.h" #include "VpaUtils.h" #include "VpaStructs.h" @@ -21,7 +22,7 @@ using namespace alphabet; namespace determinization { namespace vpa { -class VpaDeterminizer3 +class VpaDeterminizer3 : public Determinizer { private: PDA* nvpa; @@ -41,7 +42,7 @@ class VpaDeterminizer3 public: VpaDeterminizer3(PDA* nvpa); - PDA* determinize(); + Automaton* determinize(); }; } -- GitLab