8#include <ext/algorithm>
31 template <
class TerminalSymbolType,
class NonterminalSymbolType >
34 template <
class TerminalSymbolType,
class NonterminalSymbolType >
47 template <
class TerminalSymbolType,
class NonterminalSymbolType >
60 template <
class TerminalSymbolType,
class NonterminalSymbolType >
73 template <
class TerminalSymbolType,
class NonterminalSymbolType >
86 template <
class TerminalSymbolType,
class NonterminalSymbolType >
99 template <
class TerminalSymbolType,
class NonterminalSymbolType >
112 template <
class TerminalSymbolType,
class NonterminalSymbolType >
125 template <
class TerminalSymbolType,
class NonterminalSymbolType >
129template <
class TerminalSymbolType,
class NonterminalSymbolType >
132 res.setNonterminalAlphabet(
grammar.getNonterminalAlphabet());
133 res.setTerminalAlphabet(
grammar.getTerminalAlphabet());
134 res.setGeneratesEpsilon(
grammar.getGeneratesEpsilon());
136 for(
const auto& nonterminal :
grammar.getNonterminalAlphabet()) {
137 if(
grammar.getRules().find(nonterminal) ==
grammar.getRules().end())
continue;
140 return singleRHS[0] == nonterminal;
142 return grammar.getTerminalAlphabet().count(singleRHS[0]) || singleRHS[0] >= nonterminal;
145 res.addNonterminalSymbol(primed);
147 if(singleRHS[0] == nonterminal) {
150 res.addRule(primed, tmpRHS);
152 tmpRHS.push_back(primed);
153 res.addRule(primed, tmpRHS);
157 res.addRule(nonterminal, tmpRHS);
159 tmpRHS.push_back(primed);
160 res.addRule(nonterminal, tmpRHS);
165 res.addRule(nonterminal, singleRHS);
172template <
class TerminalSymbolType,
class NonterminalSymbolType >
175 res.setNonterminalAlphabet(
grammar.getNonterminalAlphabet());
176 res.setTerminalAlphabet(
grammar.getTerminalAlphabet());
177 res.setGeneratesEpsilon(
grammar.getGeneratesEpsilon());
179 for(
const NonterminalSymbolType& lhs :
grammar.getNonterminalAlphabet()) {
181 if(
grammar.getRules().find(lhs) ==
grammar.getRules().end())
continue;
183 res.addRule(lhs, rule);
189 if(
grammar.getRules().find(lhs) ==
grammar.getRules().end())
continue;
190 if(!origNonterminals.contains(lhs)) {
192 res.addRule(lhs, rule);
200 if(
res.getTerminalAlphabet().contains(singleRHS[0])) {
201 res.addRule(lhs, singleRHS);
205 if(secondLHS >= lhs) {
206 res.addRule(lhs, singleRHS);
209 if(
grammar.getRules().find(secondLHS) ==
grammar.getRules().end()) {
216 newRHS.insert(newRHS.end(), singleRHS.begin() + 1, singleRHS.end());
217 res.addRule(lhs, newRHS);
224template <
class TerminalSymbolType,
class NonterminalSymbolType >
231 while(
i <
grammar.getNonterminalAlphabet().size()) {
234 if(step == nextStep)
break;
235 step = std::move(nextStep);
242template <
class TerminalSymbolType,
class NonterminalSymbolType >
248 for(
const auto& rule :
grammar.getRules()) {
249 for(
const auto& rhs : rule.second) {
250 if(rhs.template is < TerminalSymbolType > ( ) ) {
251 tmp.
addRule ( rule.first, { rhs.template get < TerminalSymbolType > ( ) } );
253 const auto & rhsPair = rhs.template get < ext::pair < NonterminalSymbolType, NonterminalSymbolType > > ( );
254 tmp.
addRule(rule.first, {rhsPair.first, rhsPair.second});
261template <
class TerminalSymbolType,
class NonterminalSymbolType >
266template <
class TerminalSymbolType,
class NonterminalSymbolType >
271template <
class TerminalSymbolType,
class NonterminalSymbolType >
276template <
class TerminalSymbolType,
class NonterminalSymbolType >
281template <
class TerminalSymbolType,
class NonterminalSymbolType >
Basic exception from which all other exceptions are derived.
Definition: CommonException.h:21
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
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
void setTerminalAlphabet(ext::set< TerminalSymbolType > symbols)
Definition: EpsilonFreeCFG.h:240
void setNonterminalAlphabet(ext::set< NonterminalSymbolType > symbols)
Definition: EpsilonFreeCFG.h:202
const ext::set< NonterminalSymbolType > & getNonterminalAlphabet() const &
Definition: EpsilonFreeCFG.h:173
bool addRule(NonterminalSymbolType leftHandSide, ext::vector< ext::variant< TerminalSymbolType, NonterminalSymbolType > > rightHandSide)
Add a new rule of a grammar.
Definition: EpsilonFreeCFG.h:308
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
Greibach normal form of a context free grammar in Chomsky hierarchy or type 2 in Chomsky hierarchy....
Definition: GNF.h:65
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
static grammar::RightRG< TerminalSymbolType, NonterminalSymbolType > convert(const grammar::LeftRG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: ToGrammarRightRG.h:37
Definition: LeftRecursionRemover.h:30
static grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > remove(const grammar::EpsilonFreeCFG< TerminalSymbolType, NonterminalSymbolType > &grammar)
Definition: LeftRecursionRemover.h:225
return grammar
Definition: ToGrammarLeftRG.h:99
int i
Definition: AllEpsilonClosure.h:118
return res
Definition: MinimizeByPartitioning.h:145
T createUnique(T object, const Alphabets &... alphabets)
Definition: createUnique.hpp:46
all_of(T &&...) -> all_of< T... >
any_of(T &&...) -> any_of< T... >
Definition: ToAutomaton.h:24