27#include <ext/algorithm>
45class TerminalAlphabet;
46class NonterminalAlphabet;
63template <
class SymbolType = DefaultSymbolType >
64class NonContractingGrammar final :
public core::Components < NonContractingGrammar < SymbolType >, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > {
73 bool generatesEpsilon;
144 return this->
template accessComponent < InitialSymbol > ( ).get ( );
153 return std::move ( this->
template accessComponent < InitialSymbol > ( ).
get ( ) );
164 return this->
template accessComponent < InitialSymbol > ( ).set ( std::move ( symbol ) );
173 return this->
template accessComponent < NonterminalAlphabet > ( ).get ( );
182 return std::move ( this->
template accessComponent < NonterminalAlphabet > ( ).
get ( ) );
193 return this->
template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
202 this->
template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
211 return this->
template accessComponent < TerminalAlphabet > ( ).get ( );
220 return std::move ( this->
template accessComponent < TerminalAlphabet > ( ).
get ( ) );
231 return this->
template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
240 this->
template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
288 return out <<
"(NonContractingGrammar"
292 <<
" rules = " << instance.
getRules ( )
298template <
class SymbolType >
302template <
class SymbolType >
303NonContractingGrammar < SymbolType >::NonContractingGrammar (
ext::set < SymbolType > nonterminalAlphabet,
ext::set < SymbolType > terminalAlphabet,
SymbolType initialSymbol ) :
core::Components <
NonContractingGrammar,
ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >,
SymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon (
false ) {
306template <
class SymbolType >
308 int lSize = leftHandSide.size ( );
310 if (
std::all_of ( leftHandSide.begin ( ), leftHandSide.end ( ), [
this] (
const SymbolType symbol ) {
311 return !getNonterminalAlphabet ( ).count ( symbol );
315 for (
const SymbolType & symbol : leftHandSide )
316 if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
319 int rSize = rightHandSide.size ( );
324 for (
const SymbolType & symbol : rightHandSide )
325 if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
328 return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
331template <
class SymbolType >
333 int lSize = leftHandSide.size ( );
335 if (
std::all_of ( leftHandSide.begin ( ), leftHandSide.end ( ), [
this] (
const SymbolType symbol ) {
336 return !getNonterminalAlphabet ( ).count ( symbol );
340 for (
const SymbolType & symbol : leftHandSide )
341 if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
346 int rSize = rightHandSide.size ( );
352 if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
359template <
class SymbolType >
364template <
class SymbolType >
366 return std::move ( rules );
369template <
class SymbolType >
371 return rules[leftHandSide].erase ( rightHandSide );
374template <
class SymbolType >
376 generatesEpsilon = genEps;
379template <
class SymbolType >
381 return generatesEpsilon;
393template <
class SymbolType >
406 if ( std::find ( rule.first.begin ( ), rule.first.end ( ), symbol ) != rule.first.end ( ) )
410 if ( std::find ( rhs.
begin ( ), rhs.
end ( ), symbol ) != rhs.
end ( ) )
439 if (
grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
449template <
class SymbolType >
462 if ( std::find ( rule.first.begin ( ), rule.first.end ( ), symbol ) != rule.first.end ( ) )
466 if ( std::find ( rhs.
begin ( ), rhs.
end ( ), symbol ) != rhs.
end ( ) )
471 return grammar.template accessComponent < grammar::InitialSymbol > ( ).get ( ) == symbol;
495 if (
grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
505template <
class SymbolType >
517 return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
535template <
class SymbolType >
552 res.addRules ( std::move ( lhs ), std::move ( rhs ) );
555 res.setGeneratesEpsilon ( value.getGeneratesEpsilon ( ) );
static ext::set< DefaultSymbolType > normalizeAlphabet(ext::set< SymbolType > &&symbols)
Definition: SymbolNormalize.h:50
static ext::vector< DefaultSymbolType > normalizeSymbols(ext::vector< SymbolType > &&symbols)
Definition: SymbolNormalize.h:86
static DefaultSymbolType normalizeSymbol(SymbolType &&symbol)
Definition: SymbolNormalize.h:68
Definition: components.hpp:181
static void valid(const grammar::NonContractingGrammar< SymbolType > &, const SymbolType &)
Definition: NonContractingGrammar.h:526
static bool available(const grammar::NonContractingGrammar< SymbolType > &grammar, const SymbolType &symbol)
Definition: NonContractingGrammar.h:516
Definition: components.hpp:25
static bool available(const grammar::NonContractingGrammar< SymbolType > &, const SymbolType &)
Definition: NonContractingGrammar.h:482
static void valid(const grammar::NonContractingGrammar< SymbolType > &grammar, const SymbolType &symbol)
Definition: NonContractingGrammar.h:494
static bool used(const grammar::NonContractingGrammar< SymbolType > &grammar, const SymbolType &symbol)
Definition: NonContractingGrammar.h:460
static void valid(const grammar::NonContractingGrammar< SymbolType > &grammar, const SymbolType &symbol)
Definition: NonContractingGrammar.h:438
static bool used(const grammar::NonContractingGrammar< SymbolType > &grammar, const SymbolType &symbol)
Definition: NonContractingGrammar.h:404
static bool available(const grammar::NonContractingGrammar< SymbolType > &, const SymbolType &)
Definition: NonContractingGrammar.h:426
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
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
auto begin() &
Inherited behavior of begin for non-const instance.
Definition: vector.hpp:125
auto end() &
Inherited behavior of end for non-const instance.
Definition: vector.hpp:155
Definition: GrammarException.h:15
Noncontracting grammar in Chomsky hierarchy or type 1 in Chomsky hierarchy. Generates context sensiti...
Definition: NonContractingGrammar.h:64
bool addNonterminalSymbol(SymbolType symbol)
Definition: NonContractingGrammar.h:192
const ext::set< SymbolType > & getTerminalAlphabet() const &
Definition: NonContractingGrammar.h:210
bool addTerminalSymbol(SymbolType symbol)
Definition: NonContractingGrammar.h:230
void setNonterminalAlphabet(ext::set< SymbolType > symbols)
Definition: NonContractingGrammar.h:201
void setTerminalAlphabet(ext::set< SymbolType > symbols)
Definition: NonContractingGrammar.h:239
void addRules(ext::vector< SymbolType > leftHandSide, ext::set< ext::vector< SymbolType > > rightHandSide)
Add new rules of a grammar.
Definition: NonContractingGrammar.h:332
ext::set< SymbolType > && getNonterminalAlphabet() &&
Definition: NonContractingGrammar.h:181
const ext::set< SymbolType > & getNonterminalAlphabet() const &
Definition: NonContractingGrammar.h:172
void setGeneratesEpsilon(bool genEps)
Definition: NonContractingGrammar.h:375
bool operator==(const NonContractingGrammar &other) const
Definition: NonContractingGrammar.h:275
bool removeRule(const ext::vector< SymbolType > &leftHandSide, const ext::vector< SymbolType > &rightHandSide)
Definition: NonContractingGrammar.h:370
bool getGeneratesEpsilon() const
Definition: NonContractingGrammar.h:380
friend ext::ostream & operator<<(ext::ostream &out, const NonContractingGrammar &instance)
Definition: NonContractingGrammar.h:287
const ext::map< ext::vector< SymbolType >, ext::set< ext::vector< SymbolType > > > & getRules() const &
Definition: NonContractingGrammar.h:360
SymbolType && getInitialSymbol() &&
Definition: NonContractingGrammar.h:152
auto operator<=>(const NonContractingGrammar &other) const
Definition: NonContractingGrammar.h:264
const SymbolType & getInitialSymbol() const &
Definition: NonContractingGrammar.h:143
bool setInitialSymbol(SymbolType symbol)
Definition: NonContractingGrammar.h:163
ext::set< SymbolType > && getTerminalAlphabet() &&
Definition: NonContractingGrammar.h:219
NonContractingGrammar(SymbolType initialSymbol)
Creates a new instance of the grammar with a concrete initial symbol.
Definition: NonContractingGrammar.h:299
bool addRule(ext::vector< SymbolType > leftHandSide, ext::vector< SymbolType > rightHandSide)
Add a new rule of a grammar.
Definition: NonContractingGrammar.h:307
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
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
all_of(T &&...) -> all_of< T... >
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::NonContractingGrammar< > eval(grammar::NonContractingGrammar< SymbolType > &&value)
Definition: NonContractingGrammar.h:537
Definition: normalize.hpp:13