diff --git a/alib2cli/src/ast/statements/ResultPrintStatement.h b/alib2cli/src/ast/statements/ResultPrintStatement.h index fe30f6f453323a78b7af5f9b6e8d228c860da630..87f637b5a506ccdb78be827cc9862033dabe3ad6 100644 --- a/alib2cli/src/ast/statements/ResultPrintStatement.h +++ b/alib2cli/src/ast/statements/ResultPrintStatement.h @@ -10,8 +10,8 @@ public: ResultPrintStatement ( ) { } - virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & ) const override { - std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ) ); + virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override { + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ), environment.getOutput ( ) ); if ( res->numberOfParams ( ) == 0 ) return res; diff --git a/alib2cli/src/environment/Environment.h b/alib2cli/src/environment/Environment.h index 6edac91dd3008d7f9cabe871479b862f01250634..e72970fc9b9c51e193ef568b00f179d3647c6380 100644 --- a/alib2cli/src/environment/Environment.h +++ b/alib2cli/src/environment/Environment.h @@ -11,11 +11,13 @@ class Environment { ext::map < std::string, std::shared_ptr < abstraction::OperationAbstraction > > m_variables; std::unique_ptr < Environment > m_upper; + + std::reference_wrapper < std::ostream > m_output; public: - Environment ( ) { + Environment ( ) : m_output ( std::cout ) { } - Environment ( std::unique_ptr < Environment > upper ) : m_upper ( std::move ( upper ) ) { + Environment ( std::unique_ptr < Environment > upper ) : m_upper ( std::move ( upper ) ), m_output ( std::cout ) { } std::string getBinding ( const std::string & name ) const { @@ -58,6 +60,14 @@ public: return m_variables.erase ( name ); } + void setOutput ( std::ostream & output ) { + m_output = output; + } + + std::ostream & getOutput ( ) const { + return m_output; + } + }; } /* namespace cli */ diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp index e2be02264aa300b8e2b89169da7caa9976b6b2f0..237703f813bf5758f372991b2444ae55ddd77905 100644 --- a/alib2cli/src/parser/Parser.cpp +++ b/alib2cli/src/parser/Parser.cpp @@ -200,6 +200,7 @@ std::shared_ptr < Statement > Parser::single_statement ( ) { bool move = move_arg ( ); std::shared_ptr < Statement > casted_statement = single_statement ( ); return std::make_shared < CastStatement > ( std::move ( type ), casted_statement, move ); + // TODO builtin statement type to get string type } else if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) { std::unique_ptr < Arg > name = std::make_unique < ImmediateArg > ( matchIdentifier ( ) ); std::unique_ptr < CategoryOption > category = category_option ( ); diff --git a/alib2common/src/abstraction/Registry.cpp b/alib2common/src/abstraction/Registry.cpp index 5d58e1886c5ed3ff15a078e5fd2a9178252e0d27..500a7e06c3df381779dcd7519b134d4a0e01309d 100644 --- a/alib2common/src/abstraction/Registry.cpp +++ b/alib2common/src/abstraction/Registry.cpp @@ -94,8 +94,8 @@ std::shared_ptr < abstraction::OperationAbstraction > Registry::getDowncastAbstr return DowncastRegistry::getAbstraction ( concrete, base ); } -std::shared_ptr < abstraction::OperationAbstraction > Registry::getValuePrinterAbstraction ( const std::string & param ) { - return ValuePrinterRegistry::getAbstraction ( param ); +std::shared_ptr < abstraction::OperationAbstraction > Registry::getValuePrinterAbstraction ( const std::string & param, std::ostream & os ) { + return ValuePrinterRegistry::getAbstraction ( param, os ); } std::shared_ptr < abstraction::OperationAbstraction > Registry::getXmlFileWriterAbstraction ( const std::string & param, std::string filename ) { diff --git a/alib2common/src/abstraction/Registry.h b/alib2common/src/abstraction/Registry.h index 2a30239892764e828c35d3082ff658d2e75f27c7..8da6504e69f743812a80a85cb0b60db2a93271c9 100644 --- a/alib2common/src/abstraction/Registry.h +++ b/alib2common/src/abstraction/Registry.h @@ -39,7 +39,7 @@ public: static std::shared_ptr < abstraction::OperationAbstraction > getImmediateAbstraction ( const std::string & result, std::string value ); static std::shared_ptr < abstraction::OperationAbstraction > getNormalizeAbstraction ( const std::string & param ); static std::shared_ptr < abstraction::OperationAbstraction > getDowncastAbstraction ( const std::string & concrete, const std::string & base ); - static std::shared_ptr < abstraction::OperationAbstraction > getValuePrinterAbstraction ( const std::string & param ); + static std::shared_ptr < abstraction::OperationAbstraction > getValuePrinterAbstraction ( const std::string & param, std::ostream & os ); static std::shared_ptr < abstraction::OperationAbstraction > getXmlFileWriterAbstraction ( const std::string & param, std::string filename ); static std::shared_ptr < abstraction::OperationAbstraction > getXmlComposerAbstraction ( const std::string & param ); static std::shared_ptr < abstraction::OperationAbstraction > getXmlParserAbstraction ( const std::string & typeName, ext::deque < sax::Token > tokens ); diff --git a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp index 24c0c28300f2a6c6aa3d1ff6850923329736c3c2..553c98167edda0a89faf15c3ba681cddeef04e1c 100644 --- a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp +++ b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp @@ -16,12 +16,17 @@ namespace abstraction { template < class ParamType > class ValuePrinterAbstraction : public UnaryOperationAbstraction < void, ParamType > { + std::ostream & m_ostream; + public: + ValuePrinterAbstraction ( std::ostream & os ) : m_ostream ( os ) { + } + virtual bool run ( ) override { if ( ! this->inputsReady ( ) ) return false; - std::cout << std::get < 0 > ( this->m_params )->getConstValueReference ( ) << std::endl; + m_ostream << std::get < 0 > ( this->m_params )->getConstValueReference ( ) << std::endl; return true; } }; @@ -29,6 +34,9 @@ public: template < > class ValuePrinterAbstraction < void > : public NullaryOperationAbstraction < void > { public: + ValuePrinterAbstraction ( std::ostream & ) { + } + virtual bool run ( ) override { return true; } diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.cpp b/alib2common/src/abstraction/ValuePrinterRegistry.cpp index 89c5198a72266cc7ac9fcb4998923fe3fc43948d..b4c085df005e10bc8a7ebc359c6c3c3098f4542d 100644 --- a/alib2common/src/abstraction/ValuePrinterRegistry.cpp +++ b/alib2common/src/abstraction/ValuePrinterRegistry.cpp @@ -9,17 +9,17 @@ namespace abstraction { -std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::getAbstraction ( const std::string & param ) { +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::getAbstraction ( const std::string & param, std::ostream & os ) { auto res = getEntries ( ).find ( param ); if ( res == getEntries ( ).end ( ) ) throw exception::CommonException ( "Entry " + param + " not available." ); - return res->second->getAbstraction ( ); + return res->second->getAbstraction ( os ); } template < > -std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const { - return std::make_shared < abstraction::ValuePrinterAbstraction < void > > ( ); +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( std::ostream & os ) const { + return std::make_shared < abstraction::ValuePrinterAbstraction < void > > ( os ); } } /* namespace abstraction */ diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.hpp b/alib2common/src/abstraction/ValuePrinterRegistry.hpp index ccf6d3694a17915214c9f270995444ee97177293..8d797d1ec74337ec0386f11ec4315fe6e226e0a6 100644 --- a/alib2common/src/abstraction/ValuePrinterRegistry.hpp +++ b/alib2common/src/abstraction/ValuePrinterRegistry.hpp @@ -19,7 +19,7 @@ namespace abstraction { class ValuePrinterRegistry { class Entry { public: - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const = 0; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::ostream & os ) const = 0; }; @@ -29,7 +29,7 @@ class ValuePrinterRegistry { EntryImpl ( ) { } - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::ostream & os ) const override; }; static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) { @@ -49,7 +49,7 @@ public: registerValuePrinter < ParamType > ( std::move ( param ) ); } - static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & param ); + static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & param, std::ostream & os ); }; } /* namespace abstraction */ @@ -59,12 +59,12 @@ public: namespace abstraction { template < class Param > -std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < Param >::getAbstraction ( ) const { - return std::make_shared < abstraction::ValuePrinterAbstraction < const Param & > > ( ); +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < Param >::getAbstraction ( std::ostream & os ) const { + return std::make_shared < abstraction::ValuePrinterAbstraction < const Param & > > ( os ); } template < > -std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const; +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( std::ostream & ) const; } /* namespace abstraction */