27#include <ext/algorithm>
45class TerminalAlphabet;
46class NonterminalAlphabet;
64template <
class TerminalSymbolType = DefaultSymbolType,
class NonterminalSymbolType = DefaultSymbolType >
65class EpsilonFreeCFG final :
public core::Components < EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > {
74 bool generatesEpsilon;
145 return this->
template accessComponent < InitialSymbol > ( ).get ( );
154 return std::move ( this->
template accessComponent < InitialSymbol > ( ).
get ( ) );
165 return this->
template accessComponent < InitialSymbol > ( ).set ( std::move ( symbol ) );
174 return this->
template accessComponent < NonterminalAlphabet > ( ).get ( );
183 return std::move ( this->
template accessComponent < NonterminalAlphabet > ( ).
get ( ) );
194 return this->
template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
203 this->
template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
212 return this->
template accessComponent < TerminalAlphabet > ( ).get ( );
221 return std::move ( this->
template accessComponent < TerminalAlphabet > ( ).
get ( ) );
232 return this->
template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
241 this->
template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
289 return out <<
"(EpsilonFreeCFG"
293 <<
" rules = " << instance.
getRules ( )
299template <
class TerminalSymbolType,
class NonterminalSymbolType >
303template <
class TerminalSymbolType,
class NonterminalSymbolType >
304EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::EpsilonFreeCFG (
ext::set < NonterminalSymbolType > nonterminalAlphabet,
ext::set < TerminalSymbolType > terminalAlphabet, NonterminalSymbolType initialSymbol ) :
core::Components <
EpsilonFreeCFG,
ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet,
ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon (
false ) {
307template <
class TerminalSymbolType,
class NonterminalSymbolType >
309 if ( rightHandSide.empty ( ) )
312 if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
316 if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
319 return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
322template <
class TerminalSymbolType,
class NonterminalSymbolType >
324 if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
332 if ( ! getTerminalAlphabet ( ).count ( symbol ) && ! getNonterminalAlphabet ( ).count ( symbol ) )
339template <
class TerminalSymbolType,
class NonterminalSymbolType >
344template <
class TerminalSymbolType,
class NonterminalSymbolType >
346 return std::move ( rules );
349template <
class TerminalSymbolType,
class NonterminalSymbolType >
351 return rules[leftHandSide].erase ( rightHandSide );
354template <
class TerminalSymbolType,
class NonterminalSymbolType >
356 generatesEpsilon = genEps;
359template <
class TerminalSymbolType,
class NonterminalSymbolType >
361 return generatesEpsilon;
374template <
class TerminalSymbolType,
class NonterminalSymbolType >
375class SetConstraint<
grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, TerminalSymbolType, grammar::TerminalAlphabet > {
388 if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
415 if (
grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count (
ext::poly_comp ( symbol ) ) )
426template <
class TerminalSymbolType,
class NonterminalSymbolType >
427class SetConstraint<
grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::NonterminalAlphabet > {
439 if ( rule.first == symbol )
443 if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
448 return grammar.template accessComponent < grammar::InitialSymbol > ( ).get ( ) == symbol;
472 if (
grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count (
ext::poly_comp ( symbol ) ) )
483template <
class TerminalSymbolType,
class NonterminalSymbolType >
484class ElementConstraint<
grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::InitialSymbol > {
495 return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
513template <
class TerminalSymbolType,
class NonterminalSymbolType >
514struct normalize <
grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > > {
530 res.addRules ( std::move ( lhs ), std::move ( rhs ) );
533 res.setGeneratesEpsilon ( value.getGeneratesEpsilon ( ) );
static ext::set< DefaultSymbolType > normalizeAlphabet(ext::set< SymbolType > &&symbols)
Definition: SymbolNormalize.h:50
static ext::vector< ext::variant< DefaultSymbolType, DefaultSymbolType > > normalizeVariantSymbols(ext::vector< ext::variant< FirstSymbolType, SecondSymbolType > > &&symbols)
Definition: SymbolNormalize.h:95
static DefaultSymbolType normalizeSymbol(SymbolType &&symbol)
Definition: SymbolNormalize.h:68
Definition: components.hpp:181
static void valid(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType &)
Definition: EpsilonFreeCFG.h:504
static bool available(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &grammar, const NonterminalSymbolType &symbol)
Definition: EpsilonFreeCFG.h:494
Definition: components.hpp:25
static void valid(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &grammar, const TerminalSymbolType &symbol)
Definition: EpsilonFreeCFG.h:414
static bool available(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &, const TerminalSymbolType &)
Definition: EpsilonFreeCFG.h:402
static bool used(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &grammar, const TerminalSymbolType &symbol)
Definition: EpsilonFreeCFG.h:385
static void valid(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &grammar, const NonterminalSymbolType &symbol)
Definition: EpsilonFreeCFG.h:471
static bool used(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &grammar, const NonterminalSymbolType &symbol)
Definition: EpsilonFreeCFG.h:437
static bool available(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType &)
Definition: EpsilonFreeCFG.h:459
Definition: setComponents.hpp:26
Class extending the map class from the standard library. Original reason is to allow printing of the ...
Definition: map.hpp:48
Implementation of the variant class allowing to store any type of those listed in the template parame...
Definition: variant.hpp:98
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
Context free grammar without epsilon rules in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: EpsilonFreeCFG.h:65
void setTerminalAlphabet(ext::set< TerminalSymbolType > symbols)
Definition: EpsilonFreeCFG.h:240
bool addNonterminalSymbol(NonterminalSymbolType symbol)
Definition: EpsilonFreeCFG.h:193
void setNonterminalAlphabet(ext::set< NonterminalSymbolType > symbols)
Definition: EpsilonFreeCFG.h:202
bool setInitialSymbol(NonterminalSymbolType symbol)
Definition: EpsilonFreeCFG.h:164
bool addTerminalSymbol(TerminalSymbolType symbol)
Definition: EpsilonFreeCFG.h:231
EpsilonFreeCFG(NonterminalSymbolType initialSymbol)
Creates a new instance of the grammar with a concrete initial symbol.
Definition: EpsilonFreeCFG.h:300
NonterminalSymbolType && getInitialSymbol() &&
Definition: EpsilonFreeCFG.h:153
const ext::set< NonterminalSymbolType > & getNonterminalAlphabet() const &
Definition: EpsilonFreeCFG.h:173
ext::set< TerminalSymbolType > && getTerminalAlphabet() &&
Definition: EpsilonFreeCFG.h:220
const NonterminalSymbolType & getInitialSymbol() const &
Definition: EpsilonFreeCFG.h:144
auto operator<=>(const EpsilonFreeCFG &other) const
Definition: EpsilonFreeCFG.h:265
ext::set< NonterminalSymbolType > && getNonterminalAlphabet() &&
Definition: EpsilonFreeCFG.h:182
void addRules(NonterminalSymbolType leftHandSide, ext::set< ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > > rightHandSide)
Add new rules of a grammar.
Definition: EpsilonFreeCFG.h:323
bool addRule(NonterminalSymbolType leftHandSide, ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > rightHandSide)
Add a new rule of a grammar.
Definition: EpsilonFreeCFG.h:308
bool operator==(const EpsilonFreeCFG &other) const
Definition: EpsilonFreeCFG.h:276
bool getGeneratesEpsilon() const
Definition: EpsilonFreeCFG.h:360
const ext::map< NonterminalSymbolType, ext::set< ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > > > & getRules() const &
Definition: EpsilonFreeCFG.h:340
const ext::set< TerminalSymbolType > & getTerminalAlphabet() const &
Definition: EpsilonFreeCFG.h:211
void setGeneratesEpsilon(bool genEps)
Definition: EpsilonFreeCFG.h:355
bool removeRule(const NonterminalSymbolType &leftHandSide, const ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > &rightHandSide)
Definition: EpsilonFreeCFG.h:350
friend ext::ostream & operator<<(ext::ostream &out, const EpsilonFreeCFG &instance)
Definition: EpsilonFreeCFG.h:288
Definition: GrammarException.h:15
return res
Definition: MinimizeByPartitioning.h:145
Definition: normalize.hpp:10
constexpr tuple< Elements &... > tie(Elements &... args) noexcept
Helper of extended tuple of references construction. The tuple is constructed to reffer to values in ...
Definition: tuple.hpp:218
reference_mover< T > make_mover(T ¶m)
Move adaptor construction function specialized to lvalue reference parameter.
Definition: iterator.hpp:468
std::string to_string(const T &value)
To string method designated for objects that can be casted to string.
Definition: string.hpp:131
PolyComp< T > poly_comp(const T &inst)
Definition: functional.hpp:60
auto begin(Container &&cont) -> decltype(std::forward(cont).begin())
Definition: iterator.hpp:900
Definition: ToAutomaton.h:24
void end()
Definition: measurements.cpp:19
auto & get(ext::ptr_array< Type, N > &tpl)
Specialisation of get function for pointer arrays.
Definition: ptr_array.hpp:693
static grammar::EpsilonFreeCFG< > eval(grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &&value)
Definition: EpsilonFreeCFG.h:515
Definition: normalize.hpp:13