From a010dfffcedf61cd3494dd6bb9bcc0538e67d406 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sat, 9 Sep 2017 19:58:05 +0200 Subject: [PATCH] use cli in generate binary --- agenerate2/makefile.conf | 6 +- agenerate2/src/agenerate.cpp | 66 ++++++++++--------- .../grammar/generate/CockeYoungerKasami.cpp | 6 +- .../src/grammar/generate/CockeYoungerKasami.h | 6 +- .../grammar/generate/GenerateUpToLength.cpp | 14 ++-- .../src/grammar/generate/GenerateUpToLength.h | 6 +- .../src/abstraction/PrimitiveRegistrator.cpp | 1 + .../src/common/PrimitiveRegistrator2.cpp | 3 + arun2/src/arun.cpp | 1 + 9 files changed, 51 insertions(+), 58 deletions(-) diff --git a/agenerate2/makefile.conf b/agenerate2/makefile.conf index e3b9e66b32..5cd7072694 100644 --- a/agenerate2/makefile.conf +++ b/agenerate2/makefile.conf @@ -1,4 +1,4 @@ EXECUTABLE:=agenerate2 -LINK_PATHS=../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2common/ ../alib2std/ -LINK_LIBRARIES=alib2elgo alib2algo alib2data alib2common alib2std xml2 -INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2elgo/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/ +LINK_PATHS=../alib2cli/ ../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2common/ ../alib2std/ +LINK_LIBRARIES=alib2cli alib2elgo alib2algo alib2data alib2common alib2std xml2 +INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2cli/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/ diff --git a/agenerate2/src/agenerate.cpp b/agenerate2/src/agenerate.cpp index bfcbd64d39..987e06d50c 100644 --- a/agenerate2/src/agenerate.cpp +++ b/agenerate2/src/agenerate.cpp @@ -8,17 +8,10 @@ #include <tclap/CmdLine.h> #include <global/GlobalData.h> #include <measure> -#include <vector> -#include <sax/FromXMLParserHelper.h> -#include <factory/XmlDataFactory.hpp> #include <exception/CommonException.h> -#include <string/LinearString.h> -#include <grammar/Grammar.h> -#include <grammar/generate/GenerateUpToLength.h> -#include <grammar/generate/CockeYoungerKasami.h> -#include <container/ObjectsSet.h> -#include <primitive/Bool.h> +#include <lexer/Lexer.h> +#include <parser/Parser.h> int main ( int argc, char * argv[] ) { try { @@ -58,40 +51,51 @@ int main ( int argc, char * argv[] ) { if ( measure.isSet ( ) ) common::GlobalData::measure = true; + cli::Environment environment; + environment.setBinding ( "stringInput", stringInput.getValue ( ) ); + environment.setBinding ( "grammarInput", grammarInput.getValue ( ) ); + environment.setBinding ( "upTo", ext::to_string ( upto.getValue ( ) ) ); + environment.setBinding ( "stdout", "-" ); + measurements::start ( "Overal", measurements::Type::OVERALL ); measurements::start ( "Input read", measurements::Type::AUXILIARY ); + + cli::Parser parser ( cli::Lexer ( "execute <#grammarInput > $grammar" ) ); + parser.parse ( )->run ( environment ); - if ( ( type.getValue ( ) == "upTo" ) && upto.isSet ( ) ) { - grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( sax::FromXMLParserHelper::parseInput(grammarInput) ); - - measurements::end ( ); - measurements::start ( "Algorithm", measurements::Type::MAIN ); + if ( type.getValue ( ) == "CYK" ) { + parser = cli::Parser ( cli::Lexer ( "execute <#stringInput > $string" ) ); + parser.parse ( )->run ( environment ); + } - ext::set < string::LinearString < > > res = grammar::generate::GenerateUpToLength::generate ( grammar, upto.getValue ( ) ); + if ( type.getValue ( ) == "upTo" ) { + parser = cli::Parser ( cli::Lexer ( "execute (unsigned) #upTo > $upTo" ) ); + parser.parse ( )->run ( environment ); + } - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); + measurements::end ( ); + measurements::start ( "Algorithm", measurements::Type::MAIN ); - alib::XmlDataFactory::toStdout ( res ); + std::string cliCommand; + if ( ( type.getValue ( ) == "upTo" ) ) { + cliCommand = "execute grammar::generate::GenerateUpToLength $grammar $upTo > $output"; } else if ( type.getValue ( ) == "CYK" ) { - grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( sax::FromXMLParserHelper::parseInput(grammarInput) ); - string::LinearString < > string = alib::XmlDataFactory::fromTokens ( sax::FromXMLParserHelper::parseInput(stringInput) ); - - measurements::end ( ); - measurements::start ( "Algorithm", measurements::Type::MAIN ); - - bool res = grammar::generate::CockeYoungerKasami::generate ( grammar, string ); - - measurements::end ( ); - measurements::start ( "Output write", measurements::Type::AUXILIARY ); - - alib::XmlDataFactory::toStdout ( res ); + cliCommand = "execute grammar::generate::CockeYoungerKasami $grammar $string > $output"; } else { throw exception::CommonException ( "Invalid run type" ); } + parser = cli::Parser ( cli::Lexer ( cliCommand ) ); + parser.parse ( )->run ( environment ); + measurements::end ( ); - measurements::end ( ); + measurements::start ( "Output write", measurements::Type::AUXILIARY ); + + parser = cli::Parser ( cli::Lexer ( "execute $output >#stdout" ) ); + parser.parse ( )->run ( environment ); + + measurements::end(); + measurements::end(); if ( measure.getValue ( ) ) ext::cmeasure << measurements::results ( ) << std::endl; diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp index b1e57761d2..d3b4a03839 100644 --- a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp +++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp @@ -12,11 +12,7 @@ namespace grammar { namespace generate { -auto CockeYoungerKasamiCNF = registration::OverloadRegister < CockeYoungerKasami, bool, grammar::CNF < > > ( CockeYoungerKasami::generate ); - -bool CockeYoungerKasami::generate ( const grammar::Grammar & grammar, const string::LinearString < > & string ) { - return dispatch ( grammar.getData ( ), string ); -} +auto CockeYoungerKasamiCNF = registration::AbstractRegister < CockeYoungerKasami, bool, const grammar::CNF < > &, const string::LinearString < > & > ( CockeYoungerKasami::generate ); } /* namespace generate */ diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.h b/alib2algo/src/grammar/generate/CockeYoungerKasami.h index dd708881fd..b3bb5eab34 100644 --- a/alib2algo/src/grammar/generate/CockeYoungerKasami.h +++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.h @@ -8,10 +8,8 @@ #ifndef COCKE_YOUNGER_KASAMI_H_ #define COCKE_YOUNGER_KASAMI_H_ -#include <core/multipleDispatch.hpp> #include <global/GlobalData.h> -#include <grammar/Grammar.h> #include <grammar/ContextFree/CNF.h> #include <string/LinearString.h> @@ -22,10 +20,8 @@ namespace generate { /** * Implements algorithms from Melichar, chapter 3.3 */ -class CockeYoungerKasami : public alib::SingleDispatch < CockeYoungerKasami, bool, const grammar::GrammarBase &, const string::LinearString < > & > { +class CockeYoungerKasami { public: - static bool generate ( const grammar::Grammar & grammar, const string::LinearString < > & string ); - template < class SymbolType > static bool generate ( const grammar::CNF < SymbolType > & grammar, const string::LinearString < SymbolType > & string ); diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp index ad2b120b46..a481ff3eba 100644 --- a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp +++ b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp @@ -12,15 +12,11 @@ namespace grammar { namespace generate { -auto GenerateUpToLengthEpsilonFreeCFG = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::EpsilonFreeCFG < > > ( GenerateUpToLength::generate ); -auto GenerateUpToLengthGNF = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::GNF < > > ( GenerateUpToLength::generate ); -auto GenerateUpToLengthCNF = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::CNF < > > ( GenerateUpToLength::generate ); -auto GenerateUpToLengthLeftRG = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::LeftRG < > > ( GenerateUpToLength::generate ); -auto GenerateUpToLengthRightRG = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::RightRG < > > ( GenerateUpToLength::generate ); - -ext::set<string::LinearString < >> GenerateUpToLength::generate(const grammar::Grammar& grammar, unsigned length) { - return dispatch(grammar.getData(), length); -} +auto GenerateUpToLengthEpsilonFreeCFG = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::EpsilonFreeCFG < > &, unsigned > ( GenerateUpToLength::generate ); +auto GenerateUpToLengthGNF = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::GNF < > &, unsigned > ( GenerateUpToLength::generate ); +auto GenerateUpToLengthCNF = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::CNF < > &, unsigned > ( GenerateUpToLength::generate ); +auto GenerateUpToLengthLeftRG = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::LeftRG < > &, unsigned > ( GenerateUpToLength::generate ); +auto GenerateUpToLengthRightRG = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::RightRG < > &, unsigned > ( GenerateUpToLength::generate ); } /* namespace generate */ diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.h b/alib2algo/src/grammar/generate/GenerateUpToLength.h index ba1530dba9..7e50f00fa5 100644 --- a/alib2algo/src/grammar/generate/GenerateUpToLength.h +++ b/alib2algo/src/grammar/generate/GenerateUpToLength.h @@ -8,8 +8,6 @@ #ifndef GRAMMAR_GENERATE_UP_TO_LENGTH_H_ #define GRAMMAR_GENERATE_UP_TO_LENGTH_H_ -#include <core/multipleDispatch.hpp> - #include <grammar/Grammar.h> #include <string/LinearString.h> #include <set> @@ -28,10 +26,8 @@ namespace generate { /** * Implements algorithms from Melichar, chapter 3.3 */ -class GenerateUpToLength : public alib::SingleDispatch < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::GrammarBase &, unsigned > { +class GenerateUpToLength { public: - static ext::set < string::LinearString < > > generate( const grammar::Grammar & grammar, unsigned length ); - template < class T, class SymbolType = typename grammar::SymbolTypeOfGrammar < T > > static ext::set < string::LinearString < SymbolType > > generate ( const T & grammar, unsigned length ); }; diff --git a/alib2common/src/abstraction/PrimitiveRegistrator.cpp b/alib2common/src/abstraction/PrimitiveRegistrator.cpp index afc37b1931..9fbc139828 100644 --- a/alib2common/src/abstraction/PrimitiveRegistrator.cpp +++ b/alib2common/src/abstraction/PrimitiveRegistrator.cpp @@ -36,6 +36,7 @@ public: abstraction::CastRegistry::registerCast < bool, int > ( false ); abstraction::CastRegistry::registerCastAlgorithm < bool, std::string > ( ( bool ( * ) ( std::string ) ) ext::from_string < bool >, false ); + abstraction::CastRegistry::registerCastAlgorithm < unsigned, std::string > ( "unsigned", ext::to_string < std::string > ( ), ( unsigned ( * ) ( std::string ) ) ext::from_string < unsigned >, false ); abstraction::CastRegistry::registerCast < size_t, int > ( "size_t", ext::to_string < int > ( ), false ); abstraction::CastRegistry::registerCast < size_t, int > ( false ); diff --git a/alib2data/src/common/PrimitiveRegistrator2.cpp b/alib2data/src/common/PrimitiveRegistrator2.cpp index deeb2a070c..6b0e988abf 100644 --- a/alib2data/src/common/PrimitiveRegistrator2.cpp +++ b/alib2data/src/common/PrimitiveRegistrator2.cpp @@ -31,6 +31,8 @@ #include <common/ranked_symbol.hpp> #include <alphabet/RankedSymbol.h> +#include <string/LinearString.h> + namespace abstraction { class PrimitiveRegistrator2 { @@ -44,6 +46,7 @@ public: abstraction::XmlParserRegistry::registerXmlParser < DefaultStateType > ( "DefaultStateType" ); abstraction::XmlFileWriterRegistry::registerXmlFileWriter < DefaultStateType > ( ); + abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::set < string::LinearString < > > > ( ); } }; diff --git a/arun2/src/arun.cpp b/arun2/src/arun.cpp index 57619c5ca1..abfc6bc1f1 100644 --- a/arun2/src/arun.cpp +++ b/arun2/src/arun.cpp @@ -100,6 +100,7 @@ int main(int argc, char* argv[]) { measurements::end(); measurements::end(); + if(measure.getValue()) ext::cmeasure << measurements::results() << std::endl; return 0; -- GitLab