diff --git a/adeterminize/src/Determinizer.h b/adeterminize/src/Determinizer.h new file mode 100644 index 0000000000000000000000000000000000000000..84b61b2a71a04b96e0f8fdd737726fb5b392cdcc --- /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 6e016dff33c72e3a68b9465e9cc828b28e07bbbe..be71c90a47e937c3b23450fb4f67be2dee46c62a 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 bc3bd5cf43c0c7c5abad406b219a82f1025c5255..fbb12e787337ae1b649a9d4ebc304f5fe288cb77 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 f40374aeca4107cc39a40bc9488d818ff9cbb3ca..81750bb6af0275d68503ff10cacfb943f6264a9b 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 965d0241c5939a8786b67a0926eb0381c909cbda..a5cc5a6437eb846f49337fb0b6d2a78fd49975f9 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 e32d6fa0a0e59c9a6e5db61f1446e0770e74670d..de7a0c1a4d11edab5af7b07f334f1b8d0c444b79 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 8b94bef76d6ab6e7e2db8d9b18d3f2c579d2ea96..462a6c0e4d25b0c8f30e0a35f9e538e18bf919ad 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 437f5cef95436f854ba57acd881a92608eef3f26..45fe8707e11b193afa600f7676641941603e5786 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 0e87dc3fee35fe9c67dd6022ef84ab5cb5e50475..f9202550399f84ecf236814e52297e739bbd39db 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 875bd94f2ed1662cad0a8b6aca16fdaec15b0e67..399c8bf806a15849f47b1f75333f35e03d57ef3d 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 4259e91abeb14e79446ccbde85b13d785ab6db5d..fc32224df0ccc4b4f73b522cf427258995795ccd 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 8a81a783049ddf90bb0e93825233d46e3fe13bc9..c2fa82ec00fc7b64f0c4f000db4a5ec0d1754dad 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 2d0bbb3d1c4486c0e4d7e9ee5843acc739fdc3d3..368c7aa708413f50ef734ed18f8f129db9e83b96 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 b22d499884dc2fe24e1e74f6d26bf124c916e5a5..b1ccab3e4d5d9a545bcba1c5badc4086d4780bf8 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 711b0f414ab669bc59542a442c82d271d31f335a..c069e659980a4ea9db2fad1e335e9ba2c5fc9292 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 ead10b7d191bfbe89be09f0ac27c62dc576ab5d7..4c5574ef284058ce62f4722dd046a437c5a2e337 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(); }; }