8#include <ext/algorithm>
33 template <
class TerminalSymbolType,
class NonterminalSymbolType >
36 template<
class T,
class TerminalSymbolType =
typename grammar::TerminalSymbolTypeOfGrammar < T >,
class NonterminalSymbolType =
typename grammar::NonterminalSymbolTypeOfGrammar < T > >
50 template <
class TerminalSymbolType,
class NonterminalSymbolType >
63 template <
class TerminalSymbolType,
class NonterminalSymbolType >
76 template <
class TerminalSymbolType,
class NonterminalSymbolType >
89 template <
class TerminalSymbolType,
class NonterminalSymbolType >
102 template <
class TerminalSymbolType,
class NonterminalSymbolType >
115 template <
class TerminalSymbolType,
class NonterminalSymbolType >
128 template <
class TerminalSymbolType,
class NonterminalSymbolType >
141 template <
class TerminalSymbolType,
class NonterminalSymbolType >
154 template <
class TerminalSymbolType,
class NonterminalSymbolType >
158template <
class TerminalSymbolType,
class NonterminalSymbolType >
160 if(rhs.size() ==
i) {
161 if(
clear.empty ( ))
return;
163 }
else if(rhs[
i].
template is < NonterminalSymbolType > ( ) && nullableNonterminals.find ( rhs [
i ].template get < NonterminalSymbolType > ( ) ) != nullableNonterminals.
end()) {
164 removeNullableNonterminals(
grammar, nullableNonterminals, lhs, rhs,
i+1,
clear);
166 clear.push_back ( rhs [
i ] );
167 removeNullableNonterminals(
grammar, nullableNonterminals, lhs, rhs,
i+1,
clear);
169 clear.push_back ( rhs [
i ] );
170 removeNullableNonterminals(
grammar, nullableNonterminals, lhs, rhs,
i+1,
clear);
174template<
class T,
class TerminalSymbolType,
class NonterminalSymbolType >
178 for(
const auto & symbol :
grammar.getNonterminalAlphabet() )
179 result.addNonterminalSymbol( symbol );
181 for(
const auto & symbol :
grammar.getTerminalAlphabet() )
182 result.addTerminalSymbol( symbol );
188 for(
const auto & rule : rawRules )
189 for(
const auto & rhs : rule.second) {
190 if(rhs.empty ( ))
continue;
192 EpsilonRemover::removeNullableNonterminals(
result, nullableNonterminals, rule.first, rhs, 0, {});
195 if(nullableNonterminals.find(
grammar.getInitialSymbol()) != nullableNonterminals.
end())
196 result.setGeneratesEpsilon(
true);
201template <
class TerminalSymbolType,
class NonterminalSymbolType >
203 return EpsilonRemover::removeInternal(
grammar);
206template <
class TerminalSymbolType,
class NonterminalSymbolType >
211template <
class TerminalSymbolType,
class NonterminalSymbolType >
216template <
class TerminalSymbolType,
class NonterminalSymbolType >
221template <
class TerminalSymbolType,
class NonterminalSymbolType >
223 return EpsilonRemover::removeInternal(
grammar);
226template <
class TerminalSymbolType,
class NonterminalSymbolType >
228 return EpsilonRemover::removeInternal(
grammar);
231template <
class TerminalSymbolType,
class NonterminalSymbolType >
236template <
class TerminalSymbolType,
class NonterminalSymbolType >
238 return EpsilonRemover::removeInternal(
grammar);
241template <
class TerminalSymbolType,
class NonterminalSymbolType >
auto end() &
Inherited behavior of end for non-const instance.
Definition: set.hpp:129
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 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
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
static ext::map< NonterminalSymbolType, ext::set< ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > > > getRawRules(const LG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: RawRules.h:92
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
static ext::set< NonterminalSymbolType > getNullableNonterminals(const T &grammar)
Definition: NullableNonterminals.h:44
Definition: EpsilonRemover.h:32
static grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > remove(const grammar::CFG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: EpsilonRemover.h:202
return grammar
Definition: ToGrammarLeftRG.h:99
int i
Definition: AllEpsilonClosure.h:118
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
void clear(ext::vector< bool, Ts ... > &v)
Clears all bits in the vector of booleans.
Definition: vector.hpp:876
Definition: ToAutomaton.h:24