Skip to content
Snippets Groups Projects
Commit 04ab2fe6 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

UnreachableSymbols visitor

parent bb6351d5
No related branches found
No related tags found
No related merge requests found
...@@ -17,7 +17,9 @@ ...@@ -17,7 +17,9 @@
#include <grammar/Regular/RightLG.h> #include <grammar/Regular/RightLG.h>
#include <grammar/Regular/RightRG.h> #include <grammar/Regular/RightRG.h>
   
#include <std/set.hpp> #include <algorithm>
#include <deque>
#include <set>
   
namespace grammar { namespace grammar {
   
...@@ -65,6 +67,75 @@ template std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( c ...@@ -65,6 +67,75 @@ template std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( c
template std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( const grammar::RightLG & grammar ); template std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( const grammar::RightLG & grammar );
template std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( const grammar::RightRG & grammar ); template std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( const grammar::RightRG & grammar );
   
std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols(const grammar::Grammar& grammar) {
std::set<alphabet::Symbol> out;
grammar.getData().Accept((void*) &out, UnreachableSymbols::UNREACHABLE_NONTERMINALS);
return out;
}
void UnreachableSymbols::Visit(void* data, const grammar::LeftLG& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::LeftRG& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::RightLG& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::RightRG& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::LG& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::CFG& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::EpsilonFreeCFG& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::CNF& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void* data, const grammar::GNF& grammar) const {
std::set<alphabet::Symbol> & out = *((std::set<alphabet::Symbol>*) data);
out = std::move(this->getUnreachableSymbols(grammar));
}
void UnreachableSymbols::Visit(void*, const grammar::CSG&) const {
throw exception::AlibException("Unsupported grammar type CSG");
}
void UnreachableSymbols::Visit(void*, const grammar::NonContractingGrammar&) const {
throw exception::AlibException("Unsupported grammar type NonConctractingGrammar");
}
void UnreachableSymbols::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const {
throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar");
}
void UnreachableSymbols::Visit(void*, const grammar::UnrestrictedGrammar&) const {
throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar");
}
const UnreachableSymbols UnreachableSymbols::UNREACHABLE_NONTERMINALS;
} /* namespace properties */ } /* namespace properties */
   
} /* namespace grammar */ } /* namespace grammar */
...@@ -8,12 +8,7 @@ ...@@ -8,12 +8,7 @@
#ifndef UNREACHABLE_SYMBOLS_H_ #ifndef UNREACHABLE_SYMBOLS_H_
#define UNREACHABLE_SYMBOLS_H_ #define UNREACHABLE_SYMBOLS_H_
   
#include <algorithm> #include <grammar/Grammar.h>
#include <deque>
#include <set>
#include <exception/AlibException.h>
#include <alphabet/Symbol.h> #include <alphabet/Symbol.h>
   
namespace grammar { namespace grammar {
...@@ -23,14 +18,32 @@ namespace properties { ...@@ -23,14 +18,32 @@ namespace properties {
/** /**
* Implements algorithms from Melichar, chapter 3.3 * Implements algorithms from Melichar, chapter 3.3
*/ */
class UnreachableSymbols { class UnreachableSymbols : public grammar::VisitableGrammarBase::const_visitor_type {
public: public:
static std::set<alphabet::Symbol> getUnreachableSymbols( const grammar::Grammar & grammar );
/** /**
* Implements * Implements
*/ */
template<class T> template<class T>
static std::set<alphabet::Symbol> getUnreachableSymbols( const T & grammar ); static std::set<alphabet::Symbol> getUnreachableSymbols( 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 UnreachableSymbols UNREACHABLE_NONTERMINALS;
}; };
   
} /* namespace properties */ } /* namespace properties */
......
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