diff --git a/agenerate2/src/agenerate.cpp b/agenerate2/src/agenerate.cpp index ce3c41283176d293656ebdd7b4fe4b5980bc6c2e..93ec7fbc018e71a68fb5ffce6c831473de70e711 100644 --- a/agenerate2/src/agenerate.cpp +++ b/agenerate2/src/agenerate.cpp @@ -18,108 +18,109 @@ #include <container/ObjectsSet.h> #include <primitive/Bool.h> -int main(int argc, char* argv[]) { +int main ( int argc, char * argv[] ) { try { - TCLAP::CmdLine cmd("String generate from grammar", ' ', "0.01"); + TCLAP::CmdLine cmd ( "String generate from grammar", ' ', "0.01" ); - std::vector<std::string> allowed; - allowed.push_back("upTo"); - allowed.push_back("CYK"); - TCLAP::ValuesConstraint<std::string> allowedVals( allowed ); + std::vector < std::string > allowed; + allowed.push_back ( "upTo" ); + allowed.push_back ( "CYK" ); + TCLAP::ValuesConstraint < std::string > allowedVals ( allowed ); - TCLAP::ValueArg<std::string> type( "t", "type", "Run type", false, "accept", &allowedVals); - cmd.add( type ); + TCLAP::ValueArg < std::string > type ( "t", "type", "Run type", false, "accept", & allowedVals ); + cmd.add ( type ); - TCLAP::ValueArg<unsigned> upto( "", "upto", "Generate all strings up to length", false, 5, "unsigned"); - cmd.add( upto ); + TCLAP::ValueArg < unsigned > upto ( "", "upto", "Generate all strings up to length", false, 5, "unsigned" ); + cmd.add ( upto ); - TCLAP::ValueArg<std::string> string( "s", "string", "String from file", false, "-", "file"); - cmd.add( string ); + TCLAP::ValueArg < std::string > string ( "s", "string", "String from file", false, "-", "file" ); + cmd.add ( string ); - TCLAP::ValueArg<std::string> grammar( "g", "grammar", "Grammar to use", false, "-", "file"); - cmd.add( grammar ); + TCLAP::ValueArg < std::string > grammar ( "g", "grammar", "Grammar to use", false, "-", "file" ); + cmd.add ( grammar ); - TCLAP::SwitchArg measure( "m", "measure", "Measure times", false); - cmd.add( measure ); + TCLAP::SwitchArg measure ( "m", "measure", "Measure times", false ); + cmd.add ( measure ); - TCLAP::SwitchArg verbose( "v", "verbose", "Be verbose", false); - cmd.add( verbose ); + TCLAP::SwitchArg verbose ( "v", "verbose", "Be verbose", false ); + cmd.add ( verbose ); - cmd.parse(argc, argv); + cmd.parse ( argc, argv ); - if(verbose.isSet()) + if ( verbose.isSet ( ) ) common::GlobalData::verbose = true; - if(measure.isSet()) + + if ( measure.isSet ( ) ) common::GlobalData::measure = true; - std::chrono::measurements::start("Overal", std::chrono::measurements::Type::OVERALL); - std::chrono::measurements::start("Input read", std::chrono::measurements::Type::AUXILARY); + std::chrono::measurements::start ( "Overal", std::chrono::measurements::Type::OVERALL ); + std::chrono::measurements::start ( "Input read", std::chrono::measurements::Type::AUXILARY ); + + std::deque < sax::Token > stringTokens; - std::deque<sax::Token> stringTokens; - if(string.isSet()) { - if(string.getValue() == "-") { - sax::SaxParseInterface::parseStdin(stringTokens); - } else { - sax::SaxParseInterface::parseFile(string.getValue(), stringTokens); - } + if ( string.isSet ( ) ) { + if ( string.getValue ( ) == "-" ) + sax::SaxParseInterface::parseStdin ( stringTokens ); + else + sax::SaxParseInterface::parseFile ( string.getValue ( ), stringTokens ); } - std::deque<sax::Token> grammarTokens; - if(grammar.isSet()) { - if(grammar.getValue() == "-") { - sax::SaxParseInterface::parseStdin(grammarTokens); - } else { - sax::SaxParseInterface::parseFile(grammar.getValue(), grammarTokens); - } + std::deque < sax::Token > grammarTokens; + + if ( grammar.isSet ( ) ) { + if ( grammar.getValue ( ) == "-" ) + sax::SaxParseInterface::parseStdin ( grammarTokens ); + else + sax::SaxParseInterface::parseFile ( grammar.getValue ( ), grammarTokens ); } else { - sax::SaxParseInterface::parseStdin(grammarTokens); + sax::SaxParseInterface::parseStdin ( grammarTokens ); } - if( type.getValue() == "upTo" && upto.isSet() ) { - grammar::Grammar grammar = alib::XmlDataFactory::fromTokens<grammar::Grammar>(grammarTokens); + if ( ( type.getValue ( ) == "upTo" ) && upto.isSet ( ) ) { + grammar::Grammar grammar = alib::XmlDataFactory::fromTokens < grammar::Grammar > ( grammarTokens ); - std::chrono::measurements::end(); - std::chrono::measurements::start("Algorithm", std::chrono::measurements::Type::MAIN); + std::chrono::measurements::end ( ); + std::chrono::measurements::start ( "Algorithm", std::chrono::measurements::Type::MAIN ); - std::set<string::LinearString> res = grammar::generate::GenerateUpToLength::generate(grammar, upto.getValue()); + std::set < string::LinearString > res = grammar::generate::GenerateUpToLength::generate ( grammar, upto.getValue ( ) ); - std::chrono::measurements::end(); - std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY); + std::chrono::measurements::end ( ); + std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY ); - alib::XmlDataFactory::toStdout( res ); - } else if ( type.getValue() == "CYK" ) { - grammar::Grammar grammar = alib::XmlDataFactory::fromTokens<grammar::Grammar>(grammarTokens); - string::LinearString string = alib::XmlDataFactory::fromTokens<string::LinearString>(stringTokens); + alib::XmlDataFactory::toStdout ( res ); + } else if ( type.getValue ( ) == "CYK" ) { + grammar::Grammar grammar = alib::XmlDataFactory::fromTokens < grammar::Grammar > ( grammarTokens ); + string::LinearString string = alib::XmlDataFactory::fromTokens < string::LinearString > ( stringTokens ); - std::chrono::measurements::end(); - std::chrono::measurements::start("Algorithm", std::chrono::measurements::Type::MAIN); + std::chrono::measurements::end ( ); + std::chrono::measurements::start ( "Algorithm", std::chrono::measurements::Type::MAIN ); - bool res = grammar::generate::CockeYoungerKasami::generate(grammar, string); + bool res = grammar::generate::CockeYoungerKasami::generate ( grammar, string ); - std::chrono::measurements::end(); - std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY); + std::chrono::measurements::end ( ); + std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY ); - alib::XmlDataFactory::toStdout( res ); + alib::XmlDataFactory::toStdout ( res ); } else { - throw exception::AlibException( "Invalid run type" ); + throw exception::AlibException ( "Invalid run type" ); } - std::chrono::measurements::end(); - std::chrono::measurements::end(); + std::chrono::measurements::end ( ); + std::chrono::measurements::end ( ); - if(measure.getValue()) std::clog << std::chrono::measurements::results() << std::endl; + if ( measure.getValue ( ) ) std::clog << std::chrono::measurements::results ( ) << std::endl; return 0; } catch ( const exception::AlibException & exception ) { - alib::XmlDataFactory::toStdout( exception ); + alib::XmlDataFactory::toStdout ( exception ); return 1; - } catch (const TCLAP::ArgException& exception) { - std::cout << exception.error() << std::endl; + } catch ( const TCLAP::ArgException & exception ) { + std::cout << exception.error ( ) << std::endl; return 2; - } catch (const std::exception& exception) { - std::cerr << "Exception caught: " << exception.what() << std::endl; + } catch ( const std::exception & exception ) { + std::cerr << "Exception caught: " << exception.what ( ) << std::endl; return 3; - } catch (...) { + } catch ( ... ) { std::cerr << "Unknown exception caught." << std::endl; return 127; } diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp index f08df75f1b6af8f39b97eb1d884bdc20f5137583..26aa5f9a3ba3876eb8622bcc99ba9caa6eabfd77 100644 --- a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp +++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp @@ -12,81 +12,76 @@ namespace grammar { namespace generate { -bool CockeYoungerKasami::generate( const grammar::CNF & grammar, const string::LinearString & string ) { - unsigned stringSize = string.getContent().size(); +bool CockeYoungerKasami::generate ( const grammar::CNF & grammar, const string::LinearString & string ) { + unsigned stringSize = string.getContent ( ).size ( ); - if(stringSize == 0 && grammar.getGeneratesEpsilon()) return true; + if ( ( stringSize == 0 ) && grammar.getGeneratesEpsilon ( ) ) return true; - std::vector<std::vector<std::set<alphabet::Symbol>>> data; - data.resize(stringSize); - for(unsigned i = 0; i < stringSize; i++) { - data[i].resize(stringSize - i); - } + std::vector < std::vector < std::set < alphabet::Symbol > > > data; + data.resize ( stringSize ); - for(unsigned i = 0; i < stringSize; i++) { - for( const std::pair < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > > > rule : grammar.getRules ( ) ) { + for ( unsigned i = 0; i < stringSize; i++ ) + data[i].resize ( stringSize - i ); + + for ( unsigned i = 0; i < stringSize; i++ ) + for ( const std::pair < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > > > rule : grammar.getRules ( ) ) { const alphabet::Symbol & lhs = rule.first; - for( const std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > rhs : rule.second ) { - if( rhs.is< alphabet::Symbol >() && rhs.get< alphabet::Symbol >() == string.getContent()[i]) { - data[0][i].insert(lhs); - } - } + for ( const std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > rhs : rule.second ) + if ( rhs.is < alphabet::Symbol > ( ) && ( rhs.get < alphabet::Symbol > ( ) == string.getContent ( )[i] ) ) + data[0][i].insert ( lhs ); + } - } - for(unsigned i = 1; i < stringSize; i++) { - for(unsigned j = 0; j < stringSize - i; j++) { - std::set<alphabet::Symbol> & targetCell = data[i][j]; //Element to compute - for(unsigned k = 0; k < i; k++) { - const std::set<alphabet::Symbol> & vertical = data[k][j]; - const std::set<alphabet::Symbol> & diagonal = data[i - 1 - k][j + 1 + k]; // Sources of data - for(const alphabet::Symbol & verticalElement : vertical) { - for(const alphabet::Symbol & diagonalElement : diagonal) { + for ( unsigned i = 1; i < stringSize; i++ ) + for ( unsigned j = 0; j < stringSize - i; j++ ) { + std::set < alphabet::Symbol > & targetCell = data[i][j]; // Element to compute - for( const std::pair < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > > > rule : grammar.getRules ( ) ) { + for ( unsigned k = 0; k < i; k++ ) { + const std::set < alphabet::Symbol > & vertical = data[k][j]; + const std::set < alphabet::Symbol > & diagonal = data[i - 1 - k][j + 1 + k]; // Sources of data + + for ( const alphabet::Symbol & verticalElement : vertical ) { + for ( const alphabet::Symbol & diagonalElement : diagonal ) + + for ( const std::pair < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > > > rule : grammar.getRules ( ) ) { const alphabet::Symbol & lhs = rule.first; - for( const std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > rhs : rule.second ) { - if( rhs.is< std::pair<alphabet::Symbol, alphabet::Symbol > >() ) { - const std::pair<alphabet::Symbol, alphabet::Symbol > rhsp = rhs.get< std::pair<alphabet::Symbol, alphabet::Symbol > >(); + for ( const std::variant < alphabet::Symbol, std::pair < alphabet::Symbol, alphabet::Symbol > > rhs : rule.second ) + if ( rhs.is < std::pair < alphabet::Symbol, alphabet::Symbol > > ( ) ) { + const std::pair < alphabet::Symbol, alphabet::Symbol > rhsp = rhs.get < std::pair < alphabet::Symbol, alphabet::Symbol > > ( ); - if(rhsp.first == verticalElement && rhsp.second == diagonalElement ) { - targetCell.insert(lhs); - } + if ( ( rhsp.first == verticalElement ) && ( rhsp.second == diagonalElement ) ) + targetCell.insert ( lhs ); } - } } - } } - } - } - } + + if ( common::GlobalData::verbose ) - for(const std::vector<std::set<alphabet::Symbol>> & row : data) { - for( const std::set<alphabet::Symbol>& element : row) { + for ( const std::vector < std::set < alphabet::Symbol > > & row : data ) { + for ( const std::set < alphabet::Symbol > & element : row ) std::clog << element << " "; - } + std::clog << std::endl; } - return data[stringSize - 1][0].count(grammar.getInitialSymbol()); + return data[stringSize - 1][0].count ( grammar.getInitialSymbol ( ) ); } -auto CockeYoungerKasamiCNF = CockeYoungerKasami::RegistratorWrapper<bool, grammar::CNF>(CockeYoungerKasami::getInstance(), CockeYoungerKasami::generate); +auto CockeYoungerKasamiCNF = CockeYoungerKasami::RegistratorWrapper < bool, grammar::CNF > ( CockeYoungerKasami::getInstance ( ), CockeYoungerKasami::generate ); -bool CockeYoungerKasami::generate(const grammar::Grammar& grammar, const string::LinearString & string) { - return getInstance().dispatch(grammar.getData(), string); +bool CockeYoungerKasami::generate ( const grammar::Grammar & grammar, const string::LinearString & string ) { + return getInstance ( ).dispatch ( grammar.getData ( ), string ); } } /* namespace generate */ } /* namespace grammar */ - diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.h b/alib2algo/src/grammar/generate/CockeYoungerKasami.h index 8f49af3a648ddce9b57de457923f008d91e69535..90f6f758d36b2fbb8c5c820bb36ec1c1ea2d2f1b 100644 --- a/alib2algo/src/grammar/generate/CockeYoungerKasami.h +++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.h @@ -21,16 +21,18 @@ namespace generate { /** * Implements algorithms from Melichar, chapter 3.3 */ -class CockeYoungerKasami : public std::SingleDispatchLastStaticParam<bool, grammar::GrammarBase, const string::LinearString &> { +class CockeYoungerKasami : public std::SingleDispatchLastStaticParam < bool, grammar::GrammarBase, const string::LinearString & > { public: - static bool generate( const grammar::Grammar & grammar, const string::LinearString & string ); + static bool generate ( const grammar::Grammar & grammar, const string::LinearString & string ); - static bool generate( const grammar::CNF & grammar, const string::LinearString & string ); + static bool generate ( const grammar::CNF & grammar, const string::LinearString & string ); - static CockeYoungerKasami& getInstance() { + static CockeYoungerKasami & getInstance ( ) { static CockeYoungerKasami res; + return res; } + }; } /* namespace generate */