39 template <
class TerminalSymbolType,
class NonterminalSymbolType >
45 template <
class TerminalSymbolType,
class NonterminalSymbolType >
51 template <
class TerminalSymbolType,
class NonterminalSymbolType >
57 template <
class TerminalSymbolType,
class NonterminalSymbolType >
63 template <
class TerminalSymbolType,
class NonterminalSymbolType >
69 template <
class TerminalSymbolType,
class NonterminalSymbolType >
75 template <
class TerminalSymbolType,
class NonterminalSymbolType >
81 template <
class TerminalSymbolType,
class NonterminalSymbolType >
87 template <
class TerminalSymbolType,
class NonterminalSymbolType >
91template <
class TerminalSymbolType,
class NonterminalSymbolType >
95 for ( ; nonterminalPosition != rightHandSide.
end ( ); ++nonterminalPosition )
96 if (
grammar.getNonterminalAlphabet ( ).count ( * nonterminalPosition ) )
break;
98 if ( nonterminalPosition == rightHandSide.
end ( ) ) {
102 rhs.push_back ( std::move ( symbol.template get < TerminalSymbolType > ( ) ) );
104 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
110 rhs1.push_back ( std::move ( symbol.template get < TerminalSymbolType > ( ) ) );
113 rhs2.push_back ( std::move ( symbol.template get < TerminalSymbolType > ( ) ) );
116 return grammar.addRule ( leftHandSide,
ext::make_tuple ( std::move ( rhs1 ), std::move ( nonterminalPosition->template get < NonterminalSymbolType > ( ) ), std::move ( rhs2 ) ) );
120template <
class TerminalSymbolType,
class NonterminalSymbolType >
122 if ( rightHandSide.empty ( ) ) {
123 if ( leftHandSide !=
grammar.getInitialSymbol ( ) )
127 grammar.setGeneratesEpsilon (
true );
130 TerminalSymbolType first = std::move ( rightHandSide[0].
template get < TerminalSymbolType > ( ) );
134 rest.push_back ( std::move ( element.template get < NonterminalSymbolType > ( ) ) );
137 return grammar.addRule ( std::move ( leftHandSide ),
ext::make_pair ( std::move ( first ), std::move ( rest ) ) );
141template <
class TerminalSymbolType,
class NonterminalSymbolType >
143 if ( rightHandSide.empty ( ) ) {
144 if ( leftHandSide !=
grammar.getInitialSymbol ( ) )
148 grammar.setGeneratesEpsilon (
true );
151 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
155template <
class TerminalSymbolType,
class NonterminalSymbolType >
157 if ( rightHandSide.empty ( ) ) {
158 if ( leftHandSide !=
grammar.getInitialSymbol ( ) )
162 grammar.setGeneratesEpsilon (
true );
164 }
else if ( rightHandSide.size ( ) == 1 ) {
165 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rightHandSide [ 0 ].
template get < TerminalSymbolType > ( ) ) );
166 }
else if ( rightHandSide.size ( ) == 2 ) {
167 return grammar.addRule ( std::move ( leftHandSide ),
ext::make_pair ( std::move ( rightHandSide [ 0 ].
template get < NonterminalSymbolType > ( ) ), std::move ( rightHandSide [ 1 ].
template get < NonterminalSymbolType > ( ) ) ) );
173template <
class TerminalSymbolType,
class NonterminalSymbolType >
175 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
178template <
class TerminalSymbolType,
class NonterminalSymbolType >
180 if ( rightHandSide.empty ( ) )
182 else if (
grammar.getNonterminalAlphabet ( ).count ( rightHandSide [ 0 ] ) ) {
185 rhs.push_back ( std::move ( element.template get < TerminalSymbolType > ( ) ) );
188 return grammar.addRule ( std::move ( leftHandSide ),
ext::make_pair ( std::move ( rightHandSide [ 0 ].
template get < NonterminalSymbolType > ( ) ), std::move ( rhs ) ) );
192 rhs.push_back ( std::move ( element.template get < TerminalSymbolType > ( ) ) );
195 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
199template <
class TerminalSymbolType,
class NonterminalSymbolType >
201 if ( rightHandSide.empty ( ) ) {
202 if ( leftHandSide !=
grammar.getInitialSymbol ( ) )
206 grammar.setGeneratesEpsilon (
true );
208 }
else if ( rightHandSide.size ( ) == 1 ) {
209 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rightHandSide [ 0 ].
template get < TerminalSymbolType > ( ) ) );
210 }
else if ( rightHandSide.size ( ) == 2 ) {
211 return grammar.addRule ( std::move ( leftHandSide ),
ext::make_pair ( std::move ( rightHandSide [ 0 ].
template get < NonterminalSymbolType > ( ) ), std::move ( rightHandSide [ 1 ].
template get < TerminalSymbolType > ( ) ) ) );
217template <
class TerminalSymbolType,
class NonterminalSymbolType >
219 if ( rightHandSide.empty ( ) ) {
220 if ( leftHandSide !=
grammar.getInitialSymbol ( ) )
224 grammar.setGeneratesEpsilon (
true );
226 }
else if ( rightHandSide.size ( ) == 1 ) {
227 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rightHandSide[0].
template get < TerminalSymbolType > ( ) ) );
228 }
else if ( rightHandSide.size ( ) == 2 ) {
229 return grammar.addRule ( std::move ( leftHandSide ),
ext::make_pair ( std::move ( rightHandSide[0].
template get < TerminalSymbolType > ( ) ), std::move ( rightHandSide[1].
template get < NonterminalSymbolType > ( ) ) ) );
235template <
class TerminalSymbolType,
class NonterminalSymbolType >
237 if ( rightHandSide.empty ( ) )
239 else if (
grammar.getNonterminalAlphabet ( ).count ( rightHandSide [ rightHandSide.size ( ) - 1 ] ) ) {
242 rhs.push_back ( std::move ( element.template get < TerminalSymbolType > ( ) ) );
245 return grammar.addRule ( std::move ( leftHandSide ),
ext::make_pair ( std::move ( rhs ), std::move ( rightHandSide [ rightHandSide.size ( ) - 1 ].template get < NonterminalSymbolType > ( ) ) ) );
249 rhs.push_back ( std::move ( element.template get < TerminalSymbolType > ( ) ) );
252 return grammar.addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
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
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: AddRawRule.h:27
static bool addRawRule(LG< TerminalSymbolType, NonterminalSymbolType > &grammar, NonterminalSymbolType leftHandSide, ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > rightHandSide)
Definition: AddRawRule.h:92
Context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy. Generates context free lang...
Definition: CFG.h:67
Chomsky normal form of a context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: CNF.h:66
Context free grammar without epsilon rules in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: EpsilonFreeCFG.h:65
Greibach normal form of a context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: GNF.h:65
Definition: GrammarException.h:15
Context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy. Generates context free lang...
Definition: LG.h:67
Left linear grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular languages.
Definition: LeftLG.h:66
Left regular grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular languages...
Definition: LeftRG.h:70
Right linear grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular languages...
Definition: RightLG.h:65
Right regular grammar in Chomsky hierarchy or type 3 in Chomsky hierarchy. Generates regular language...
Definition: RightRG.h:70
return res
Definition: MinimizeByPartitioning.h:145
constexpr auto make_tuple(Elements &&... args)
Helper of extended tuple construction. The tuple is constructed from values pack, types are deduced.
Definition: tuple.hpp:203
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
Definition: ToAutomaton.h:24