diff --git a/alib2algo/src/conversions/fa2rg/fa2rrg/FAtoRRGConverter.cpp b/alib2algo/src/conversions/fa2rg/fa2rrg/FAtoRRGConverter.cpp index 6fc273e1a80d13dd366a671f3aa7c43702e02c10..4cf3d3cf79d2084d3a3d0e3a9f4719ee2bb8455f 100644 --- a/alib2algo/src/conversions/fa2rg/fa2rrg/FAtoRRGConverter.cpp +++ b/alib2algo/src/conversions/fa2rg/fa2rrg/FAtoRRGConverter.cpp @@ -45,47 +45,9 @@ grammar::RightRG FAtoRRGConverter::convert(const automaton::NFA& automaton) // step 4 if(automaton.getFinalStates().count(*automaton.getInitialStates().begin())) - { - if( ! this->isSymbolOnAnyRightHandSide(grammar.getInitialSymbol(), grammar)) // 4a - { - grammar.setGeneratesEpsilon(true); - } - else // 4b - { - alphabet::Symbol newStart = alphabet::createUniqueSymbol(grammar.getInitialSymbol(), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet()); - grammar.addNonterminalSymbol(newStart); - - for(const auto& rule : grammar.getRules()) - for(const auto& rightSide : rule.second) - if(rule.first == grammar.getInitialSymbol()) - grammar.addRule(newStart, rightSide); - - grammar.setInitialSymbol(newStart); - grammar.setGeneratesEpsilon(true); - } - } + grammar.setGeneratesEpsilon(true); // okay this feature breaks algorithm but simplifies the code actually :)) return grammar; } -bool FAtoRRGConverter::isSymbolOnAnyRightHandSide(const alphabet::Symbol& symbol, const grammar::RightRG& grammar) const -{ - for(const auto& rule : grammar.getRules()) - for(const auto& rightSide : rule.second) - if(rightSide.is<std::pair<alphabet::Symbol, alphabet::Symbol>>( )) - { - const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = rightSide.get<std::pair<alphabet::Symbol, alphabet::Symbol>>(); - if(rhs.first == symbol || rhs.second == symbol) - return true; - } - else - { - const alphabet::Symbol& rhs = rightSide.get<alphabet::Symbol>(); - if(rhs == symbol) - return true; - } - - return false; -} - } /* namespace fa2rg */