8#include <ext/algorithm>
32 template<
class T,
class TerminalSymbolType =
typename grammar::TerminalSymbolTypeOfGrammar < T >,
class NonterminalSymbolType =
typename grammar::NonterminalSymbolTypeOfGrammar < T > >
33 static T removeNonEpsilonFree(
const T &
grammar );
46 template <
class TerminalSymbolType,
class NonterminalSymbolType >
59 template <
class TerminalSymbolType,
class NonterminalSymbolType >
72 template <
class TerminalSymbolType,
class NonterminalSymbolType >
85 template <
class TerminalSymbolType,
class NonterminalSymbolType >
98 template <
class TerminalSymbolType,
class NonterminalSymbolType >
111 template <
class TerminalSymbolType,
class NonterminalSymbolType >
124 template <
class TerminalSymbolType,
class NonterminalSymbolType >
137 template <
class TerminalSymbolType,
class NonterminalSymbolType >
150 template <
class TerminalSymbolType,
class NonterminalSymbolType >
154template <
class T,
class TerminalSymbolType,
class NonterminalSymbolType >
155T SimpleRulesRemover::removeNonEpsilonFree(
const T &
grammar ) {
158 for(
const auto & symbol :
grammar.getNonterminalAlphabet() )
159 result.addNonterminalSymbol( symbol );
161 for(
const auto & symbol :
grammar.getTerminalAlphabet() )
162 result.addTerminalSymbol( symbol );
166 for(
const auto & symbol :
grammar.getNonterminalAlphabet() ) {
168 for(
const auto & closureSymbol : simpleRulesClosure ) {
169 auto rules = rawRules.find(closureSymbol);
170 if(rules != rawRules.end())
for(
const auto& rawRule : rules->second ) {
171 if(rawRule.empty ( ) || (rawRule.size() == 1 && !
grammar.getNonterminalAlphabet().count(rawRule[0])) || rawRule.size() >= 2)
180template <
class TerminalSymbolType,
class NonterminalSymbolType >
182 return removeNonEpsilonFree(
grammar);
185template <
class TerminalSymbolType,
class NonterminalSymbolType >
189 for(
const auto & symbol :
grammar.getNonterminalAlphabet() )
190 result.addNonterminalSymbol( symbol );
192 for(
const auto & symbol :
grammar.getTerminalAlphabet() )
193 result.addTerminalSymbol( symbol );
195 for(
const auto & symbol :
grammar.getNonterminalAlphabet() ) {
197 for(
const auto & closureSymbol : simpleRulesClosure ) {
198 auto rules =
grammar.getRules().find(closureSymbol);
199 if(rules !=
grammar.getRules().end())
for(
const auto& rawRule : rules->second ) {
200 if(rawRule.empty ( ) || (rawRule.size() == 1 && !
grammar.getNonterminalAlphabet().count(rawRule[0])) || rawRule.size() >= 2)
201 result.addRule(symbol, rawRule);
211template <
class TerminalSymbolType,
class NonterminalSymbolType >
216template <
class TerminalSymbolType,
class NonterminalSymbolType >
221template <
class TerminalSymbolType,
class NonterminalSymbolType >
223 return removeNonEpsilonFree(
grammar);
226template <
class TerminalSymbolType,
class NonterminalSymbolType >
228 return removeNonEpsilonFree(
grammar);
231template <
class TerminalSymbolType,
class NonterminalSymbolType >
236template <
class TerminalSymbolType,
class NonterminalSymbolType >
238 return removeNonEpsilonFree(
grammar);
241template <
class TerminalSymbolType,
class NonterminalSymbolType >
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
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 > getNonterminalUnitRuleCycle(const T &grammar, const NonterminalSymbolType &nonterminal)
Definition: NonterminalUnitRuleCycle.h:41
Definition: SimpleRulesRemover.h:31
static grammar::CFG< TerminalSymbolType, NonterminalSymbolType > remove(const grammar::CFG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: SimpleRulesRemover.h:181
return grammar
Definition: ToGrammarLeftRG.h:99
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
Definition: ToAutomaton.h:24