63 for (
auto pair: kindToAttrsMap)
65 for (
auto attri: pair.second)
67 nodeSet.insert(attri);
72 for(
auto prod: symProdsPair.second)
77 tempP.insert(tempP.begin(), symProdsPair.first);
80 for (
auto filledProd : normalProds)
93 std::string tempStr =
"";
98 for(
auto itr : rawProductions)
101 for(
auto rule: head.second)
103 if (rule.size() < 3)
continue;
114 if ((X ==
u32_t(-1)) ==
false)
122 std::ostringstream ss;
124 tempStr.append(ss.str());
130 for (
unsigned i = 0; i < long_run.size(); i++)
133 if ( variableAttribute != 0)
135 variableAttributeSet.insert(variableAttribute);
138 if ( variableAttributeSet.size() == 1)
141 tempStr += char(*variableAttributeSet.begin());
144 rule = {first, tempSym};
151 if (long_run.size() ==2)
153 new_grammar[X].insert(temp_p);
158 new_grammar[X].insert(long_run);
161 while (long_run.size() > 2)
165 long_run.erase(long_run.begin());
171 if (RHX ==
u32_t(-1))
178 std::ostringstream ss;
180 tempStr.append(ss.str());
182 for (
unsigned i = 0; i < long_run.size(); i++)
185 if ( variableAttribute != 0)
187 variableAttributeSet.insert(variableAttribute);
190 if ( variableAttributeSet.size() == 1)
193 tempStr += char(*variableAttributeSet.begin());
196 auto it = new_grammar[X].find(prev_rule);
197 new_grammar[X].erase(it);
198 new_grammar[X].insert({first, tempSym});
199 new_grammar[tempSym].insert(long_run);
205 for (
auto new_head : new_grammar)
207 for (
auto prod : new_head.second)
227 while( worklist.
empty() ==
false )
235 if ( currentVariableAttribute == 0 )
237 currentVariableAttribute = symbol.variableAttribute;
241 if ( currentVariableAttribute == 0)
243 normalProds.insert(currentProduction);
248 for (
auto attribute : nodeSet)
253 if ( symbol.variableAttribute == currentVariableAttribute)
255 symbol.attribute = attribute;
256 symbol.variableAttribute = 0;
260 bool continueToFill =
false;
263 if ( symbol.variableAttribute != 0 )
265 continueToFill =
true;
268 if ( continueToFill ==
false)
270 normalProds.insert(fillingProduction);
274 worklist.
push(fillingProduction);
300 for (
auto ebnfProduction : symbolToProductionsPair.second)
304 while (i < ebnfProduction.size())
306 if (grammar->
kindToStr(ebnfProduction[i].kind) ==
"|")
309 tempPro.insert(tempPro.begin(), symbolToProductionsPair.first );
310 productions.insert(tempPro);
316 tempPro.insert(tempPro.begin(), symbolToProductionsPair.first );
317 productions.insert(tempPro);
319 symbolToProductionsPair.second.clear();
320 symbolToProductionsPair.second = productions;
329 std::string tempNonterminal =
"X";
334 for (
auto ebnfProduction : symbolToProductionsPair.second)
337 while (i < ebnfProduction.size())
339 s32_t signGroupStart = -1;
340 if (grammar->
kindToStr(ebnfProduction[i].kind) == std::string(1, sign))
343 assert(i != 1 &&
"sign in grammar associate with no symbol");
344 if (grammar->
kindToStr(ebnfProduction[i - 1].kind) != std::string(1,
')'))
346 signGroupStart = i - 1;
353 std::string groupString =
"";
354 for (
size_t j = signGroupStart; j < i; j++)
356 groupString.append(grammar->
kindToStr(ebnfProduction[j].kind));
357 groupString.append(
" ");
359 groupString.append(grammar->
kindToStr(ebnfProduction[i].kind));
360 if (newProductions.find(groupString) != newProductions.end())
362 productions.erase(ebnfProduction);
363 ebnfProduction.erase(ebnfProduction.begin() + signGroupStart, ebnfProduction.begin() + i + 1);
364 ebnfProduction.insert(ebnfProduction.begin() + signGroupStart, grammar->
strToSymbol(newProductions[groupString]));
365 productions.insert(ebnfProduction);
367 else if ( (signGroupStart == 1) && (i == ebnfProduction.size() -1))
369 newProductions[groupString] = grammar->
kindToStr(ebnfProduction[0].kind);
370 productions.erase(ebnfProduction);
371 ebnfProduction.erase(ebnfProduction.begin() + signGroupStart, ebnfProduction.begin() + i + 1);
376 tempNonterminal =
"X";
377 std::ostringstream ss;
379 tempNonterminal.append(ss.str());
381 productions.erase(ebnfProduction);
382 ebnfProduction.erase(ebnfProduction.begin() + signGroupStart, ebnfProduction.begin() + i + 1);
383 ebnfProduction.insert(ebnfProduction.begin() + signGroupStart, tempSym);
384 newProductions[groupString] = tempNonterminal;
385 productions.insert(ebnfProduction);
393 symbolToProductionsPair.second = productions;
395 for(
auto rep: newProductions)
398 std::string new_nonterminal = rep.second;
402 temp_list = {grammar->
strToSymbol(new_nonterminal)};
403 if (sign ==
'*' || sign ==
'?')
407 strTrans(rep.first, grammar, normalProd);
411 for (
auto &word : normalProd)
415 withoutSign.push_back(word);
418 withoutSign.push_back(grammar->
strToSymbol(rep.second));
422 for (
auto &word : normalProd)
426 withoutSign.push_back(word);
430 temp_list.insert(temp_list.end(), withoutSign.begin(), withoutSign.end());
439 size_t start = LHS.find_first_not_of(
" \t\n\r");
441 if (start != std::string::npos)
443 LHS = LHS.substr(start);
451 std::string delimiter;
456 while ((pos = LHS.find(delimiter)) != std::string::npos)
458 word = LHS.substr(0, pos);
459 LHS.erase(0, pos + delimiter.length());
468 for(
auto symProdPair: grammar)
470 for(
auto prod: symProdPair.second)
474 return symProdPair.first;
485 if (prod.size() == 2)
487 if ((std::find(prod.begin(), prod.end(), grammar->
strToKind(
"epsilon")) != prod.end()))
499 if (prod.size() == 3)
511 for(
auto rule: head.second)
515 long_run.erase(long_run.begin());
void barReplace(CFGrammar *grammar)
void ebnf_bin(CFGrammar *grammar)
Add nonterminal to tranfer long rules to binary rules.
void ebnfSignReplace(char sign, CFGrammar *grammar)
void insertToCFLGrammar(CFGrammar *grammar, GrammarBase::Production &prod)
Based on prod size to add on suitable member field of grammar.
void removeFirstSymbol(CFGrammar *grammar)
CFGrammar * fillAttribute(CFGrammar *grammar, const Map< CFGrammar::Kind, Set< CFGrammar::Attribute > > &kindToAttrsMap)
Expand every variable attribute in rawProductions of grammarbase.
CFGrammar * normalize(GrammarBase *generalGrammar)
Binary Normal Form(BNF) normalization with variable attribute expanded.
int ebnfBracketMatch(GrammarBase::Production &prod, int i, CFGrammar *grammar)
void getFilledProductions(GrammarBase::Production &prod, const NodeSet &nodeSet, CFGrammar *grammar, GrammarBase::Productions &normalProds)
void strTrans(std::string strPro, CFGrammar *grammar, GrammarBase::Production &normalProd)
GrammarBase::Symbol check_head(GrammarBase::SymbolMap< GrammarBase::Symbol, GrammarBase::Productions > &grammar, GrammarBase::Production &rule)
SymbolMap< Symbol, Productions > & getFirstRHSToProds()
SymbolMap< Symbol, Productions > & getSingleRHSToProds()
const u32_t num_generator()
SymbolMap< Symbol, Productions > & getSecondRHSToProds()
Productions & getEpsilonProds()
void setStartKind(Kind startKind)
void setAttributeKinds(const Set< Kind > &attributeKind)
const Map< Kind, Set< Attribute > > & getKindToAttrsMap() const
void setRawProductions(SymbolMap< Symbol, Productions > &rawProductions)
void setTotalKind(Kind totalKind)
Kind strToKind(std::string str) const
Symbol strToSymbol(const std::string str) const
Map< std::string, Kind > & getEBNFSigns()
Map< std::string, Kind > & getNonterminals()
Symbol insertNonTerminalSymbol(std::string strLit)
SymbolMap< Symbol, Productions > & getRawProductions()
Map< std::string, Kind > & getTerminals()
SymbolSet< Production > Productions
const Set< Kind > & getAttrSyms() const
Map< Key, Value, Hash, KeyEqual, Allocator > SymbolMap
void setKindToAttrsMap(const Map< Kind, Set< Attribute > > &kindToAttrsMap)
std::string kindToStr(Kind kind) const
void setEBNFSigns(Map< std::string, Kind > &EBNFSigns)
void setTerminals(Map< std::string, Kind > &terminals)
std::vector< Symbol > Production
void setNonterminals(Map< std::string, Kind > &nonterminals)
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map