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

NonterminalUnitRuleCycle visitor

parent 0ad5dec5
No related branches found
No related tags found
No related merge requests found
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <grammar/Regular/RightRG.h> #include <grammar/Regular/RightRG.h>
   
#include <std/set.hpp> #include <std/set.hpp>
#include <deque>
   
namespace grammar { namespace grammar {
   
...@@ -64,6 +65,75 @@ template std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnit ...@@ -64,6 +65,75 @@ template std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnit
template std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::RightLG& grammar, const alphabet::Symbol& nonterminal); template std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::RightLG& grammar, const alphabet::Symbol& nonterminal);
template std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::RightRG& grammar, const alphabet::Symbol& nonterminal); template std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::RightRG& grammar, const alphabet::Symbol& nonterminal);
   
std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::Grammar& grammar, const alphabet::Symbol& nonterminal) {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> out(nonterminal, {});
grammar.getData().Accept((void*) &out, NonterminalUnitRuleCycle::NONTERMINAL_UNIT_RULE_CYCLE);
return out.second;
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::LeftLG& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::LeftRG& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::RightLG& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::RightRG& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::LG& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::CFG& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::EpsilonFreeCFG& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::CNF& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void* data, const grammar::GNF& grammar) const {
std::pair<alphabet::Symbol, std::set<alphabet::Symbol>> & out = *((std::pair<alphabet::Symbol, std::set<alphabet::Symbol>>*) data);
out.second = std::move(this->getNonterminalUnitRuleCycle(grammar, out.first));
}
void NonterminalUnitRuleCycle::Visit(void*, const grammar::CSG&) const {
throw exception::AlibException("Unsupported grammar type CSG");
}
void NonterminalUnitRuleCycle::Visit(void*, const grammar::NonContractingGrammar&) const {
throw exception::AlibException("Unsupported grammar type NonConctractingGrammar");
}
void NonterminalUnitRuleCycle::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const {
throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar");
}
void NonterminalUnitRuleCycle::Visit(void*, const grammar::UnrestrictedGrammar&) const {
throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar");
}
const NonterminalUnitRuleCycle NonterminalUnitRuleCycle::NONTERMINAL_UNIT_RULE_CYCLE;
} /* namespace properties */ } /* namespace properties */
   
} /* namespace grammar */ } /* namespace grammar */
...@@ -8,12 +8,7 @@ ...@@ -8,12 +8,7 @@
#ifndef NONTERMINAL_UNIT_RULE_CYCLE_H_ #ifndef NONTERMINAL_UNIT_RULE_CYCLE_H_
#define NONTERMINAL_UNIT_RULE_CYCLE_H_ #define NONTERMINAL_UNIT_RULE_CYCLE_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,8 +18,10 @@ namespace properties { ...@@ -23,8 +18,10 @@ namespace properties {
/** /**
* Implements algorithms from Melichar, chapter 3.3 * Implements algorithms from Melichar, chapter 3.3
*/ */
class NonterminalUnitRuleCycle { class NonterminalUnitRuleCycle : public grammar::VisitableGrammarBase::const_visitor_type {
public: public:
static std::set<alphabet::Symbol> getNonterminalUnitRuleCycle( const grammar::Grammar & grammar, const alphabet::Symbol& nonterminal );
/** /**
* Retrieves set N = {B : A->^* B} for given grammar and nonterminal * Retrieves set N = {B : A->^* B} for given grammar and nonterminal
* *
...@@ -36,6 +33,23 @@ public: ...@@ -36,6 +33,23 @@ public:
*/ */
template<class T> template<class T>
static std::set<alphabet::Symbol> getNonterminalUnitRuleCycle(const T& grammar, const alphabet::Symbol& nonterminal); static std::set<alphabet::Symbol> getNonterminalUnitRuleCycle(const T& grammar, const alphabet::Symbol& nonterminal);
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 NonterminalUnitRuleCycle NONTERMINAL_UNIT_RULE_CYCLE;
}; };
   
} /* 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