Skip to content
Snippets Groups Projects
Commit 895d5c62 authored by Tomáš Pecka's avatar Tomáš Pecka
Browse files

algo: BrzozowskiRRG: Enable optimizations, fix valgrind's complaint

parent 26045970
No related branches found
No related tags found
No related merge requests found
...@@ -41,13 +41,12 @@ void BrzozowskiDerivationRRG::Visit(void* userData, const regexp::UnboundedRegEx ...@@ -41,13 +41,12 @@ void BrzozowskiDerivationRRG::Visit(void* userData, const regexp::UnboundedRegEx
grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp) grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp)
{ {
// 1. // 1.
// regexp::RegExpOptimize opt; regexp::RegExpOptimize opt;
// RegExp V = opt.optimize(regexp); regexp::RegExp V = opt.optimize(regexp);
regexp::RegExp V = regexp;
   
std::pair<std::set<alphabet::Symbol>, bool> out({}, false); std::pair<std::set<alphabet::Symbol>, bool> out({}, false);
regexp.getData().Accept((void*) &out, *this); regexp.getData().Accept((void*) &out, *this);
const std::set<alphabet::Symbol>& alphabet = out.first; const std::set<alphabet::Symbol> alphabet = out.first;
   
std::set<regexp::RegExp> N = { V }; std::set<regexp::RegExp> N = { V };
std::deque<std::set<regexp::RegExp>> Ni; std::deque<std::set<regexp::RegExp>> Ni;
...@@ -70,7 +69,7 @@ grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp) ...@@ -70,7 +69,7 @@ grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp)
{ {
string::LinearString string(std::vector<alphabet::Symbol>{a}); string::LinearString string(std::vector<alphabet::Symbol>{a});
regexp::RegExp derived = deriv.derivation(dregexp, string); regexp::RegExp derived = deriv.derivation(dregexp, string);
// derived = opt.optimize(derived); derived = opt.optimize(derived);
   
// this will also add \emptyset as a regexp (and as FA state) // this will also add \emptyset as a regexp (and as FA state)
if(N.count(derived) == 0) // if this state has already been found, do not add if(N.count(derived) == 0) // if this state has already been found, do not add
...@@ -100,6 +99,7 @@ grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp) ...@@ -100,6 +99,7 @@ grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp)
   
alphabet::Symbol nt = alphabet::createUniqueSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel(std::toBase26(nonterminalId++))))), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet()); alphabet::Symbol nt = alphabet::createUniqueSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel(std::toBase26(nonterminalId++))))), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
nonterminalMap.insert(std::make_pair(r, nt)); nonterminalMap.insert(std::make_pair(r, nt));
grammar.addNonterminalSymbol(nt);
} }
   
for(const auto & r : N) for(const auto & r : N)
...@@ -110,7 +110,7 @@ grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp) ...@@ -110,7 +110,7 @@ grammar::RightRG BrzozowskiDerivationRRG::convert(const regexp::RegExp& regexp)
{ {
string::LinearString string(std::vector<alphabet::Symbol>{a}); string::LinearString string(std::vector<alphabet::Symbol>{a});
regexp::RegExp derived = deriv.derivation(r, string); regexp::RegExp derived = deriv.derivation(r, string);
// derived = opt.optimize(derived); derived = opt.optimize(derived);
   
grammar.addRule(nonterminalMap.find(r)->second, std::make_pair(a, nonterminalMap.find(derived)->second)); grammar.addRule(nonterminalMap.find(r)->second, std::make_pair(a, nonterminalMap.find(derived)->second));
   
......
...@@ -85,7 +85,7 @@ function runTest2 { ...@@ -85,7 +85,7 @@ function runTest2 {
fi fi
} }
   
# $1 - aconversion2 sequence # $1 - aconversions2 sequence
function runTest { function runTest {
RES_GOOD=0 RES_GOOD=0
RES_FAIL=0 RES_FAIL=0
...@@ -157,8 +157,8 @@ function runTest { ...@@ -157,8 +157,8 @@ function runTest {
echo "" echo ""
} }
   
# FA -> RG -> FA ## FA -> RG -> FA
# covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA ## covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA
runTest "./aconversions2 -t RRG | ./aconversions2 -t LRG | ./aconversions2 -t FA" runTest "./aconversions2 -t RRG | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -t LRG | ./aconversions2 -t RRG | ./aconversions2 -t FA" runTest "./aconversions2 -t LRG | ./aconversions2 -t RRG | ./aconversions2 -t FA"
   
...@@ -173,16 +173,16 @@ runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a glushko ...@@ -173,16 +173,16 @@ runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a glushko
   
# FA -> RE -> RRG -> LRG -> FA # FA -> RE -> RRG -> LRG -> FA
# covers: FA -> RE (Brz. algebraic, elimination), RE -> RRG ( Brz. derivation, Glushkov), RRG -> LRG, LRG -> FA # covers: FA -> RE (Brz. algebraic, elimination), RE -> RRG ( Brz. derivation, Glushkov), RRG -> LRG, LRG -> FA
runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a brzozowski | ./aconversion2 -t LRG | ./aconversion2 -t FA" runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -ts2-t RE -a algebraic | ./aconversions2 -t RRG -a glushkov | ./aconversion2 -t LRG | ./aconversion2 -t FA" #runTest "./aconversions2 -ts2-t RE -a algebraic | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -ts2-t RE -a elimination | ./aconversions2 -t RRG -a brzozowski | ./aconversion2 -t LRG | ./aconversion2 -t FA" runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -ts2-t RE -a elimination | ./aconversions2 -t RRG -a glushkov | ./aconversion2 -t LRG | ./aconversion2 -t FA" #runTest "./aconversions2 -ts2-t RE -a elimination | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA"
   
# FA -> RRG -> RE -> FA # FA -> RRG -> RE -> FA
# covers: FA -> RRG, FA -> LRG, RRG -> RE, LRG -> RE, RE -> FA (Brz. derivation, Thompson, Glushkov) # covers: FA -> RRG, FA -> LRG, RRG -> RE, LRG -> RE, RE -> FA (Brz. derivation, Thompson, Glushkov)
# runTest "./aconversion2 -t RRG | ./aconversion2 -t RE | ./aconversion2 -t FA -a brzozowski" # runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a brzozowski"
# runTest "./aconversion2 -t LRG | ./aconversion2 -t RE | ./aconversion2 -t FA -a brzozowski" # runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a brzozowski"
# runTest "./aconversion2 -t RRG | ./aconversion2 -t RE | ./aconversion2 -t FA -a thompson" # runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a thompson"
# runTest "./aconversion2 -t LRG | ./aconversion2 -t RE | ./aconversion2 -t FA -a thompson" # runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a thompson"
# runTest "./aconversion2 -t RRG | ./aconversion2 -t RE | ./aconversion2 -t FA -a glushkov" # runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a glushkov"
# runTest "./aconversion2 -t LRG | ./aconversion2 -t RE | ./aconversion2 -t FA -a glushkov" # runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a glushkov"
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