diff --git a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp index 05d5808b08149ce611ada0968a2e3cd19622057b..2cf3e291bfd7a7b938ea88677b6ab15c4de4de1b 100644 --- a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp +++ b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp @@ -17,8 +17,6 @@ #include <grammar/Regular/RightLG.h> #include <grammar/Regular/RightRG.h> -#include <std/set.hpp> - #include "../properties/ProductiveNonterminals.h" namespace grammar { @@ -40,6 +38,75 @@ template bool IsLanguageEmpty::isLanguageEmpty( const grammar::LeftRG & grammar template bool IsLanguageEmpty::isLanguageEmpty( const grammar::RightLG & grammar ); template bool IsLanguageEmpty::isLanguageEmpty( const grammar::RightRG & grammar ); +bool IsLanguageEmpty::isLanguageEmpty(const grammar::Grammar& grammar) { + bool out; + grammar.getData().Accept((void*) &out, IsLanguageEmpty::IS_LANGUAGE_EMPTY); + return out; +} + +void IsLanguageEmpty::Visit(void* data, const grammar::LeftLG& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::LeftRG& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::RightLG& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::RightRG& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::LG& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::CFG& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::EpsilonFreeCFG& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::CNF& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void* data, const grammar::GNF& grammar) const { + bool & out = *((bool*) data); + out = this->isLanguageEmpty(grammar); +} + +void IsLanguageEmpty::Visit(void*, const grammar::CSG&) const { + throw exception::AlibException("Unsupported grammar type CSG"); +} + +void IsLanguageEmpty::Visit(void*, const grammar::NonContractingGrammar&) const { + throw exception::AlibException("Unsupported grammar type NonConctractingGrammar"); +} + +void IsLanguageEmpty::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const { + throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar"); +} + +void IsLanguageEmpty::Visit(void*, const grammar::UnrestrictedGrammar&) const { + throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar"); +} + +const IsLanguageEmpty IsLanguageEmpty::IS_LANGUAGE_EMPTY; + } /* namespace properties */ } /* namespace grammar */ diff --git a/alib2algo/src/grammar/properties/IsLanguageEmpty.h b/alib2algo/src/grammar/properties/IsLanguageEmpty.h index 8aa3a2e13571e57acb11635b84c3ef7760539d5e..ccfd0b6004667c72f60a9d1e0749b41d1c1869c4 100644 --- a/alib2algo/src/grammar/properties/IsLanguageEmpty.h +++ b/alib2algo/src/grammar/properties/IsLanguageEmpty.h @@ -8,13 +8,7 @@ #ifndef IS_LANGUAGE_EMPTY_H_ #define IS_LANGUAGE_EMPTY_H_ -#include <algorithm> -#include <deque> -#include <set> - -#include <exception/AlibException.h> - -#include <alphabet/Symbol.h> +#include <grammar/Grammar.h> namespace grammar { @@ -23,8 +17,10 @@ namespace properties { /** * Implements algorithms from Melichar, chapter 3.3 */ -class IsLanguageEmpty { +class IsLanguageEmpty : public grammar::VisitableGrammarBase::const_visitor_type { public: + static bool isLanguageEmpty( const grammar::Grammar & grammar ); + /* * Melichar 3.6 - decides whether L( grammar ) = \0 * @@ -33,6 +29,23 @@ public: */ template<class T> static bool isLanguageEmpty( const T & grammar ); + +private: + void Visit(void*, const grammar::LeftLG& grammar) const; + void Visit(void*, const grammar::LeftRG& grammar) const; + void Visit(void*, const grammar::RightLG& grammar) const; + void Visit(void*, const grammar::RightRG& grammar) const; + void Visit(void*, const grammar::LG& grammar) const; + void Visit(void*, const grammar::CFG& grammar) const; + void Visit(void*, const grammar::EpsilonFreeCFG& grammar) const; + void Visit(void*, const grammar::CNF& grammar) const; + void Visit(void*, const grammar::GNF& grammar) const; + void Visit(void*, const grammar::CSG& grammar) const; + void Visit(void*, const grammar::NonContractingGrammar& grammar) const; + void Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar& grammar) const; + void Visit(void*, const grammar::UnrestrictedGrammar& grammar) const; + + static const IsLanguageEmpty IS_LANGUAGE_EMPTY; }; } /* namespace properties */ diff --git a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eedaab2b1c758cc67c58831d60aa604dd40bd01d --- /dev/null +++ b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp @@ -0,0 +1,113 @@ +/* + * IsLanguageGeneratingEpsilon.cpp + * + * Created on: 22. 3. 2014 + * Author: Jan Travnicek + */ + +#include "IsLanguageGeneratingEpsilon.h" + +#include <grammar/ContextFree/CFG.h> +#include <grammar/ContextFree/EpsilonFreeCFG.h> +#include <grammar/ContextFree/GNF.h> +#include <grammar/ContextFree/CNF.h> +#include <grammar/ContextFree/LG.h> +#include <grammar/Regular/LeftLG.h> +#include <grammar/Regular/LeftRG.h> +#include <grammar/Regular/RightLG.h> +#include <grammar/Regular/RightRG.h> + +#include "../properties/NullableNonterminals.h" + +namespace grammar { + +namespace properties { + +template<class T> +bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const T & grammar ) { + return grammar::properties::NullableNonterminals::getNullableNonterminals( grammar ).count( grammar.getInitialSymbol( ) ); +} + +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::CFG & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::EpsilonFreeCFG & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::GNF & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::CNF & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::LG & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::LeftLG & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::LeftRG & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::RightLG & grammar ); +template bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const grammar::RightRG & grammar ); + +bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon(const grammar::Grammar& grammar) { + bool out; + grammar.getData().Accept((void*) &out, IsLanguageGeneratingEpsilon::IS_LANGUAGE_GENERATING_EPSILON); + return out; +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::LeftLG& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::LeftRG& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::RightLG& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::RightRG& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::LG& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::CFG& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::EpsilonFreeCFG& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::CNF& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void* data, const grammar::GNF& grammar) const { + bool & out = *((bool*) data); + out = std::move(this->isLanguageGeneratingEpsilon(grammar)); +} + +void IsLanguageGeneratingEpsilon::Visit(void*, const grammar::CSG&) const { + throw exception::AlibException("Unsupported grammar type CSG"); +} + +void IsLanguageGeneratingEpsilon::Visit(void*, const grammar::NonContractingGrammar&) const { + throw exception::AlibException("Unsupported grammar type NonConctractingGrammar"); +} + +void IsLanguageGeneratingEpsilon::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const { + throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar"); +} + +void IsLanguageGeneratingEpsilon::Visit(void*, const grammar::UnrestrictedGrammar&) const { + throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar"); +} + +const IsLanguageGeneratingEpsilon IsLanguageGeneratingEpsilon::IS_LANGUAGE_GENERATING_EPSILON; + +} /* namespace properties */ + +} /* namespace grammar */ + diff --git a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.h b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.h new file mode 100644 index 0000000000000000000000000000000000000000..0eb20a75056bd97dff958b6dfc7755e3a5960b1b --- /dev/null +++ b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.h @@ -0,0 +1,55 @@ +/* + * IsLanguageGeneratingEpsilon.h + * + * Created on: 22. 3. 2014 + * Author: Jan Travnicek + */ + +#ifndef IS_LANGUAGE_GENERATING_EPSILON_H_ +#define IS_LANGUAGE_GENERATING_EPSILON_H_ + +#include <grammar/Grammar.h> + +namespace grammar { + +namespace properties { + +/** + * Implements algorithms from Melichar, chapter 3.3 + */ +class IsLanguageGeneratingEpsilon : public grammar::VisitableGrammarBase::const_visitor_type { +public: + static bool isLanguageGeneratingEpsilon( const grammar::Grammar & grammar ); + + /* + * Melichar 3.6 - decides whether L( grammar ) = \0 + * + * Severals steps implemented in method CFGTransformations::getProductiveNonTerminals(); + * @see getProductiveNonTerminals + */ + template<class T> + static bool isLanguageGeneratingEpsilon( const T & grammar ); + +private: + void Visit(void*, const grammar::LeftLG& grammar) const; + void Visit(void*, const grammar::LeftRG& grammar) const; + void Visit(void*, const grammar::RightLG& grammar) const; + void Visit(void*, const grammar::RightRG& grammar) const; + void Visit(void*, const grammar::LG& grammar) const; + void Visit(void*, const grammar::CFG& grammar) const; + void Visit(void*, const grammar::EpsilonFreeCFG& grammar) const; + void Visit(void*, const grammar::CNF& grammar) const; + void Visit(void*, const grammar::GNF& grammar) const; + void Visit(void*, const grammar::CSG& grammar) const; + void Visit(void*, const grammar::NonContractingGrammar& grammar) const; + void Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar& grammar) const; + void Visit(void*, const grammar::UnrestrictedGrammar& grammar) const; + + static const IsLanguageGeneratingEpsilon IS_LANGUAGE_GENERATING_EPSILON; +}; + +} /* namespace properties */ + +} /* namespace grammar */ + +#endif /* IS_LANGUAGE_GENERATING_EPSILON_H_ */ diff --git a/alib2algo/src/grammar/simplify/Trim.cpp b/alib2algo/src/grammar/simplify/Trim.cpp index 862cbbc62179fa8943660673286d621937386974..e294dd266e4a9b591f14c52f5c263de4ca1d1f35 100644 --- a/alib2algo/src/grammar/simplify/Trim.cpp +++ b/alib2algo/src/grammar/simplify/Trim.cpp @@ -17,8 +17,6 @@ #include <grammar/Regular/RightLG.h> #include <grammar/Regular/RightRG.h> -#include <std/set.hpp> - #include "UnreachableSymbolsRemover.h" #include "UnproductiveSymbolsRemover.h" diff --git a/alib2algo/src/grammar/simplify/Trim.h b/alib2algo/src/grammar/simplify/Trim.h index 30b78b8365f733ffdcb377c162789ec2b34c2078..25cb46cdd3b75d117749f2b3d3242f1ab8fab463 100644 --- a/alib2algo/src/grammar/simplify/Trim.h +++ b/alib2algo/src/grammar/simplify/Trim.h @@ -8,13 +8,7 @@ #ifndef GRAMMAR_TRIM_H_ #define GRAMMAR_TRIM_H_ -#include <algorithm> -#include <deque> -#include <set> - -#include <exception/AlibException.h> #include <grammar/Grammar.h> -#include <alphabet/Symbol.h> namespace grammar { @@ -25,7 +19,7 @@ namespace simplify { */ class Trim : public grammar::VisitableGrammarBase::const_visitor_type { public: - static grammar::Grammar trim( const grammar::Grammar & automaton ); + static grammar::Grammar trim( const grammar::Grammar & grammar ); /** * Removes unproductive and useless symbols - Melichar 3.12