Skip to content
Snippets Groups Projects
Commit 78533b57 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

move semant. in toCNF, toGNF, generateFromGrammar

parent 4cc90129
No related branches found
No related tags found
No related merge requests found
......@@ -40,21 +40,21 @@ std::set<string::LinearString> GenerateUpToLength::generate( const T & grammar,
if(rules.find(nonterminal) == rules.end()) continue;
 
for(const std::vector<alphabet::Symbol>& rhs : rules.find(nonterminal)->second) {
if(item.first.size() + item.second.size() + rhs.size() > length) continue;
std::vector<alphabet::Symbol> newStack(item.second);
std::vector<alphabet::Symbol> newString(item.first);
newStack.insert(newStack.end(), rhs.rbegin(), rhs.rend());
 
if(newString.size() + newStack.size() > length) continue;
while(!newStack.empty() && grammar.getTerminalAlphabet().count(newStack.back())) {
newString.push_back(newStack.back());
newString.push_back(std::move(newStack.back()));
newStack.pop_back();
}
 
if(newStack.empty()) {
res.insert(string::LinearString(newString));
} else {
data.push_back(std::make_pair(newString, newStack));
data.push_back(std::make_pair(std::move(newString), std::move(newStack)));
}
}
}
......
......@@ -29,9 +29,9 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
}
grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
grammar.addRawRule(createdSymbols.find(secondProposal)->second, {second.first, second.second});
grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
 
return std::make_pair(firstLhs, createdSymbols.find(secondProposal)->second);
return std::make_pair(std::move(firstLhs), createdSymbols.find(secondProposal)->second);
} else {
auto first = splitToPairs(grammar, rhs, from, size / 2, createdSymbols);
alphabet::Symbol firstProposal{alphabet::SymbolPairSymbol(first)};
......@@ -39,7 +39,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
createdSymbols.insert(std::make_pair(firstProposal, alphabet::createUniqueSymbol(firstProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
}
grammar.addNonterminalSymbol(createdSymbols.find(firstProposal)->second);
grammar.addRawRule(createdSymbols.find(firstProposal)->second, {first.first, first.second});
grammar.addRawRule(createdSymbols.find(firstProposal)->second, {std::move(first.first), std::move(first.second)});
 
auto second = splitToPairs(grammar, rhs, from + size / 2, size - size / 2, createdSymbols);
alphabet::Symbol secondProposal{alphabet::SymbolPairSymbol(second)};
......@@ -47,7 +47,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
}
grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
grammar.addRawRule(createdSymbols.find(secondProposal)->second, {second.first, second.second});
grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
 
return std::make_pair(createdSymbols.find(firstProposal)->second, createdSymbols.find(secondProposal)->second);
}
......@@ -57,11 +57,8 @@ template<class T>
grammar::CNF convertInternal( const T & origGrammar ) {
T grammarTmp(origGrammar.getInitialSymbol());
 
for( const auto & symbol : origGrammar.getNonterminalAlphabet() )
grammarTmp.addNonterminalSymbol( symbol );
for( const auto & symbol : origGrammar.getTerminalAlphabet() )
grammarTmp.addTerminalSymbol( symbol );
grammarTmp.setNonterminalAlphabet(origGrammar.getNonterminalAlphabet() );
grammarTmp.setTerminalAlphabet( origGrammar.getTerminalAlphabet() );
 
std::map<alphabet::Symbol, alphabet::Symbol> createdSymbols;
auto origRules = origGrammar.getRawRules();
......@@ -71,7 +68,7 @@ grammar::CNF convertInternal( const T & origGrammar ) {
grammarTmp.addRawRule(origRule.first, origRhs);
else if(origRhs.size() > 2) {
auto second = splitToPairs(grammarTmp, origRhs, 0, origRhs.size(), createdSymbols);
grammarTmp.addRawRule(origRule.first, {second.first, second.second});
grammarTmp.addRawRule(origRule.first, {std::move(second.first), std::move(second.second)});
} else
throw exception::AlibException("Invalid rule in grammar");
}
......@@ -81,18 +78,15 @@ grammar::CNF convertInternal( const T & origGrammar ) {
 
grammar::CNF grammar(grammarTmp.getInitialSymbol());
 
for( const auto & symbol : grammarTmp.getNonterminalAlphabet() )
grammar.addNonterminalSymbol( symbol );
for( const auto & symbol : grammarTmp.getTerminalAlphabet() )
grammar.addTerminalSymbol( symbol );
grammar.setNonterminalAlphabet( grammarTmp.getNonterminalAlphabet() );
grammar.setTerminalAlphabet( grammarTmp.getTerminalAlphabet() );
 
std::map<alphabet::Symbol, alphabet::Symbol> terminalToShadowNonterminal;
for( const auto & symbol : grammarTmp.getTerminalAlphabet() ) {
alphabet::Symbol shadowSymbol = alphabet::createUniqueSymbol(symbol, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
terminalToShadowNonterminal.insert( std::make_pair( symbol, shadowSymbol ));
grammar.addNonterminalSymbol( shadowSymbol );
grammar.addRule(shadowSymbol, symbol);
grammar.addRule(std::move(shadowSymbol), symbol);
}
 
auto tmpRules = grammarTmp.getRawRules();
......
......@@ -81,7 +81,7 @@ grammar::GNF convertInternal( const grammar::EpsilonFreeCFG & origGrammar ) {
else
convertedNonterminals.push_back(terminalToPrimed.find(rhsSymbol)->second);
}
res.addRule(rule.first, std::make_pair(rhs[0], convertedNonterminals));
res.addRule(rule.first, std::make_pair(rhs[0], std::move(convertedNonterminals)));
}
}
return res;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment