diff --git a/alib2cli/src/ast/Param.h b/alib2cli/src/ast/Param.h index 50c16c24c3bf99befa52458145311fd1c6ca55ac..ca5b323e6cf975e9fb1486ffcec341c08b413579 100644 --- a/alib2cli/src/ast/Param.h +++ b/alib2cli/src/ast/Param.h @@ -8,20 +8,13 @@ namespace cli { class Param { - bool m_move; - public: - Param ( bool move ) : m_move ( move ) { - } - virtual ~Param ( ) noexcept { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const = 0; - bool getMove ( ) const { - return m_move; - } + virtual bool getImplicitMove ( ) const = 0; }; } /* namespace cli */ diff --git a/alib2cli/src/ast/params/CastParam.h b/alib2cli/src/ast/params/CastParam.h index 19bdd3d1fba336898ea64f29f7c022da188e2cb1..bd3d2d92440f5dacc7e2c22e55f1534fe37d465b 100644 --- a/alib2cli/src/ast/params/CastParam.h +++ b/alib2cli/src/ast/params/CastParam.h @@ -9,9 +9,10 @@ namespace cli { class CastParam final : public Param { std::unique_ptr < cli::Arg > m_type; std::unique_ptr < Param > m_param; + bool m_move; public: - CastParam ( std::unique_ptr < cli::Arg > type, std::unique_ptr < Param > param ) : Param ( true ), m_type ( std::move ( type ) ), m_param ( std::move ( param ) ) { + CastParam ( std::unique_ptr < cli::Arg > type, std::unique_ptr < Param > param, bool move ) : m_type ( std::move ( type ) ), m_param ( std::move ( param ) ), m_move ( move ) { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override { @@ -19,7 +20,11 @@ public: std::shared_ptr < abstraction::OperationAbstraction > translatedParam = m_param->translateAndEval ( prev, environment ); - return abstraction::CastHelper::eval ( translatedParam, type, getMove ( ) ); + return abstraction::CastHelper::eval ( translatedParam, type, m_move ); + } + + virtual bool getImplicitMove ( ) const override { + return true; } }; diff --git a/alib2cli/src/ast/params/FileParam.h b/alib2cli/src/ast/params/FileParam.h index 8ffb5b39b7713123ab416ffa813b92c462dd5462..f4c09c29784312a4c091cc427053ba8136a8cea3 100644 --- a/alib2cli/src/ast/params/FileParam.h +++ b/alib2cli/src/ast/params/FileParam.h @@ -11,7 +11,7 @@ class FileParam final : public Param { std::unique_ptr < cli::Arg > m_arg; public: - FileParam ( std::unique_ptr < cli::Arg > arg ) : Param ( true ), m_arg ( std::move ( arg ) ) { + FileParam ( std::unique_ptr < cli::Arg > arg ) : m_arg ( std::move ( arg ) ) { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override { @@ -19,6 +19,10 @@ public: return abstraction::XmlParserHelper::eval ( "", file ); } + + virtual bool getImplicitMove ( ) const override { + return true; + } }; } /* namespace cli */ diff --git a/alib2cli/src/ast/params/ImmediateParam.h b/alib2cli/src/ast/params/ImmediateParam.h index b7c4325960ac80b4a93c6b509a567ea23a76874a..8d866083e70613b6902e3c061d33e82ddd407d0a 100644 --- a/alib2cli/src/ast/params/ImmediateParam.h +++ b/alib2cli/src/ast/params/ImmediateParam.h @@ -11,12 +11,16 @@ class ImmediateParam final : public Param { Type m_data; public: - ImmediateParam ( Type value ) : Param ( true ), m_data ( std::move ( value ) ) { + ImmediateParam ( Type value ) : m_data ( std::move ( value ) ) { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & ) const override { return std::make_shared < abstraction::ImmediateValueAbstraction < Type > > ( m_data ); } + + virtual bool getImplicitMove ( ) const override { + return true; + } }; } /* namespace cli */ diff --git a/alib2cli/src/ast/params/PreviousResultParam.h b/alib2cli/src/ast/params/PreviousResultParam.h index c26480b8efebb8a241bd971805180dc0ea28bb57..0b5ec93c738dbdcc8af5446754750fb7a6eb308a 100644 --- a/alib2cli/src/ast/params/PreviousResultParam.h +++ b/alib2cli/src/ast/params/PreviousResultParam.h @@ -8,12 +8,13 @@ namespace cli { class PreviousResultParam final : public Param { public: - PreviousResultParam ( bool move ) : Param ( move ) { - } - virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & ) const override { return prev; } + + virtual bool getImplicitMove ( ) const override { + return false; + } }; } /* namespace cli */ diff --git a/alib2cli/src/ast/params/StatementParam.h b/alib2cli/src/ast/params/StatementParam.h index 4f465742699277685e22eada8c4d1cf5336589d7..69da76c6f6cc4c83106076362605e51076b52203 100644 --- a/alib2cli/src/ast/params/StatementParam.h +++ b/alib2cli/src/ast/params/StatementParam.h @@ -9,12 +9,16 @@ class StatementParam final : public Param { std::shared_ptr < Statement > m_statement; public: - StatementParam ( std::shared_ptr < Statement > statement, bool move ) : Param ( move ), m_statement ( statement ) { + StatementParam ( std::shared_ptr < Statement > statement ) : m_statement ( statement ) { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override { return m_statement->translateAndEval ( nullptr, environment ); } + + virtual bool getImplicitMove ( ) const override { + return false; + } }; } /* namespace cli */ diff --git a/alib2cli/src/ast/params/ValueParam.h b/alib2cli/src/ast/params/ValueParam.h index 3d9672e98491ad5e24c14d9418240f4a790f26f3..f3e3a7173bbccabe3b3579217ab961d9f10ca85b 100644 --- a/alib2cli/src/ast/params/ValueParam.h +++ b/alib2cli/src/ast/params/ValueParam.h @@ -10,12 +10,16 @@ class ValueParam final : public Param { std::unique_ptr < cli::Arg > m_arg; public: - ValueParam ( std::unique_ptr < cli::Arg > arg ) : Param ( true ), m_arg ( std::move ( arg ) ) { + ValueParam ( std::unique_ptr < cli::Arg > arg ) : m_arg ( std::move ( arg ) ) { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override { return abstraction::Registry::getImmediateAbstraction ( ext::to_string < std::string > ( ), m_arg->eval ( environment ) ); } + + virtual bool getImplicitMove ( ) const override { + return true; + } }; } /* namespace cli */ diff --git a/alib2cli/src/ast/params/VariableParam.h b/alib2cli/src/ast/params/VariableParam.h index 212a1b16b4e76a162bd8d612b7730d826155ff6f..c296eb6256aa4a21914580a9ffd00f92865ebefa 100644 --- a/alib2cli/src/ast/params/VariableParam.h +++ b/alib2cli/src/ast/params/VariableParam.h @@ -10,12 +10,16 @@ class VariableParam final : public Param { std::unique_ptr < cli::Arg > m_name; public: - VariableParam ( std::unique_ptr < cli::Arg > name, bool move ) : Param ( move ), m_name ( std::move ( name ) ) { + VariableParam ( std::unique_ptr < cli::Arg > name ) : m_name ( std::move ( name ) ) { } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override { return environment.getVariable ( m_name->eval ( environment ) ); } + + virtual bool getImplicitMove ( ) const override { + return false; + } }; } /* namespace cli */ diff --git a/alib2cli/src/ast/statements/ContainerStatement.cpp b/alib2cli/src/ast/statements/ContainerStatement.cpp index 6ca725f574b250f039eab5fc24a475e59c3df6b0..045a9395be2a318e5af0f7705b454630dc1475ea 100644 --- a/alib2cli/src/ast/statements/ContainerStatement.cpp +++ b/alib2cli/src/ast/statements/ContainerStatement.cpp @@ -8,7 +8,7 @@ namespace cli { -ContainerStatement::ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type ) : m_container ( std::move ( container ) ), m_params ( std::move ( params ) ), m_type ( std::move ( type ) ) { +ContainerStatement::ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type, ext::vector < bool > moves ) : m_container ( std::move ( container ) ), m_params ( std::move ( params ) ), m_type ( std::move ( type ) ), m_moves ( std::move ( moves ) ) { } std::shared_ptr < abstraction::OperationAbstraction > ContainerStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const { @@ -17,14 +17,16 @@ std::shared_ptr < abstraction::OperationAbstraction > ContainerStatement::transl params.push_back ( param->translateAndEval ( prev, environment ) ); } - std::vector < bool > moves; - for ( const std::unique_ptr < Param > & param : m_params ) { - moves.push_back ( param->getMove ( ) ); - } - std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getContainerAbstraction ( m_container, m_type->getType ( ) ); + ext::vector < bool > moves ( m_moves.size ( ) ); unsigned i = 0; + for ( const std::unique_ptr < Param > & param : m_params ) { + moves [ i ] = m_moves [ i ] | param->getImplicitMove ( ); + ++ i; + } + + i = 0; ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > casted_params; for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params ) { if ( abstraction::Registry::isCastNoOp ( algo->getParamType ( i ), param->getReturnType ( ) ) ) { diff --git a/alib2cli/src/ast/statements/ContainerStatement.h b/alib2cli/src/ast/statements/ContainerStatement.h index efbcd246f047976e185b8422f39f018048d8bbcb..f1b91ae1268083a96d2b690fdc0209a323ec7b1a 100644 --- a/alib2cli/src/ast/statements/ContainerStatement.h +++ b/alib2cli/src/ast/statements/ContainerStatement.h @@ -10,9 +10,10 @@ class ContainerStatement final : public Statement { std::string m_container; ext::vector < std::unique_ptr < Param > > m_params; std::unique_ptr < TypeOption > m_type; + ext::vector < bool > m_moves; public: - ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type ); + ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type, ext::vector < bool > moves ); virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override; }; diff --git a/alib2cli/src/ast/statements/SingleStatement.cpp b/alib2cli/src/ast/statements/SingleStatement.cpp index c9289f8c16b4e3819fc73b447bf1bedc40bed964..9ae634a22cefe2f83735a890b18afe3180e000e0 100644 --- a/alib2cli/src/ast/statements/SingleStatement.cpp +++ b/alib2cli/src/ast/statements/SingleStatement.cpp @@ -6,7 +6,7 @@ namespace cli { -SingleStatement::SingleStatement ( std::unique_ptr < Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > category ) : m_name ( std::move ( name ) ), m_templateParams ( std::move ( templateParams ) ), m_params ( std::move ( params ) ), m_category ( std::move ( category ) ) { +SingleStatement::SingleStatement ( std::unique_ptr < Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > category, ext::vector < bool > moves ) : m_name ( std::move ( name ) ), m_templateParams ( std::move ( templateParams ) ), m_params ( std::move ( params ) ), m_category ( std::move ( category ) ), m_moves ( std::move ( moves ) ) { } std::shared_ptr < abstraction::OperationAbstraction > SingleStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const { @@ -15,9 +15,11 @@ std::shared_ptr < abstraction::OperationAbstraction > SingleStatement::translate params.push_back ( param->translateAndEval ( prev, environment ) ); } - std::vector < bool > moves; + ext::vector < bool > moves ( m_moves.size ( ) ); + unsigned i = 0; for ( const std::unique_ptr < Param > & param : m_params ) { - moves.push_back ( param->getMove ( ) ); + moves [ i ] = m_moves [ i ] | param->getImplicitMove ( ); + ++ i; } std::string name = m_name->eval ( environment ); diff --git a/alib2cli/src/ast/statements/SingleStatement.h b/alib2cli/src/ast/statements/SingleStatement.h index 21da6e6a5d75314585f9474dcfb78a06e5431baa..1d0f6b639ef384ad71407bf3f61b33634b58d0ab 100644 --- a/alib2cli/src/ast/statements/SingleStatement.h +++ b/alib2cli/src/ast/statements/SingleStatement.h @@ -12,9 +12,10 @@ class SingleStatement final : public Statement { ext::vector < std::unique_ptr < cli::Arg > > m_templateParams; ext::vector < std::unique_ptr < Param > > m_params; std::unique_ptr < CategoryOption > m_category; + ext::vector < bool > m_moves; public: - SingleStatement ( std::unique_ptr < cli::Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > options ); + SingleStatement ( std::unique_ptr < cli::Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > options, ext::vector < bool > moves ); virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override; }; diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp index a1da50dfedddfccade4cf72236d1fba71be5612c..0b8950f4f73df81439ccb93dfe2acb5c3af4f36a 100644 --- a/alib2cli/src/parser/Parser.cpp +++ b/alib2cli/src/parser/Parser.cpp @@ -95,10 +95,15 @@ bool Parser::move_arg ( ) { } } +std::unique_ptr < Arg > Parser::template_arg ( ) { + match ( cli::Lexer::TokenType::AT_SIGN ); + return arg ( ); +} + std::unique_ptr < Param > Parser::in_redirect_param ( ) { if ( check ( cli::Lexer::TokenType::LEFT_PAREN ) ) { match ( cli::Lexer::TokenType::LEFT_PAREN ); - auto sub_statement = std::make_unique < StatementParam > ( statement_list ( ), false ); + auto sub_statement = std::make_unique < StatementParam > ( statement_list ( ) ); match ( cli::Lexer::TokenType::RIGHT_PAREN ); return sub_statement; } else { @@ -107,79 +112,39 @@ std::unique_ptr < Param > Parser::in_redirect_param ( ) { } } -std::unique_ptr < Arg > Parser::template_param ( ) { - match ( cli::Lexer::TokenType::AT_SIGN ); - return arg ( ); -} - -std::unique_ptr < Param > Parser::param ( ) { - if ( check ( cli::Lexer::TokenType::CARET_SIGN ) ) { - match ( cli::Lexer::TokenType::CARET_SIGN ); - return move_param ( ); - } else { - return value_param ( ); - } -} +ext::pair < bool, std::unique_ptr < Param > > Parser::param ( ) { + bool move = move_arg ( ); -std::unique_ptr < Param > Parser::move_param ( ) { if ( check ( cli::Lexer::TokenType::DASH_SIGN ) ) { match ( cli::Lexer::TokenType::DASH_SIGN ); - return std::make_unique < PreviousResultParam > ( true ); + return ext::make_pair ( move, std::make_unique < PreviousResultParam > ( ) ); } else if ( check ( cli::Lexer::TokenType::IN_REDIRECT ) ) { match ( cli::Lexer::TokenType::IN_REDIRECT ); - match ( cli::Lexer::TokenType::LEFT_PAREN ); - auto sub_statement = std::make_unique < StatementParam > ( statement_list ( ), true ); - match ( cli::Lexer::TokenType::RIGHT_PAREN ); - return sub_statement; - } else if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) { - match ( cli::Lexer::TokenType::DOLAR_SIGN ); - std::unique_ptr < Arg > name = arg ( ); - return std::make_unique < VariableParam > ( std::move ( name ), true ); + return ext::make_pair ( move, in_redirect_param ( ) ); } else if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) { std::string value = matchIdentifier ( ); - return std::make_unique < ImmediateParam < std::string > > ( value ); + return ext::make_pair ( move, std::make_unique < ImmediateParam < std::string > > ( value ) ); } else if ( check ( cli::Lexer::TokenType::STRING ) ) { std::string value = matchString ( ); - return std::make_unique < ImmediateParam < std::string > > ( value ); + return ext::make_pair ( move, std::make_unique < ImmediateParam < std::string > > ( value ) ); } else if ( check ( cli::Lexer::TokenType::INTEGER ) ) { int value = matchInteger ( ); - return std::make_unique < ImmediateParam < int > > ( value ); - } else { - throw exception::CommonException ( "Mismatched set while expanding move_param rule." ); - } -} - -std::unique_ptr < Param > Parser::value_param ( ) { - if ( check ( cli::Lexer::TokenType::DASH_SIGN ) ) { - match ( cli::Lexer::TokenType::DASH_SIGN ); - return std::make_unique < PreviousResultParam > ( false ); - } else if ( check ( cli::Lexer::TokenType::IN_REDIRECT ) ) { - match ( cli::Lexer::TokenType::IN_REDIRECT ); - return in_redirect_param ( ); - } else if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) { - std::string value = matchIdentifier ( ); - return std::make_unique < ImmediateParam < std::string > > ( value ); - } else if ( check ( cli::Lexer::TokenType::STRING ) ) { - std::string value = matchString ( ); - return std::make_unique < ImmediateParam < std::string > > ( value ); - } else if ( check ( cli::Lexer::TokenType::INTEGER ) ) { - int value = matchInteger ( ); - return std::make_unique < ImmediateParam < int > > ( value ); + return ext::make_pair ( move, std::make_unique < ImmediateParam < int > > ( value ) ); } else if ( check ( cli::Lexer::TokenType::LEFT_PAREN ) ) { match ( cli::Lexer::TokenType::LEFT_PAREN ); std::unique_ptr < Arg > type = arg ( ); match ( cli::Lexer::TokenType::RIGHT_PAREN ); - std::unique_ptr < Param > castedParam = param ( ); - return std::make_unique < CastParam > ( std::move ( type ), std::move ( castedParam ) ); + ext::pair < bool, std::unique_ptr < Param > > castedParam = param ( ); + return ext::make_pair ( move, std::make_unique < CastParam > ( std::move ( type ), std::move ( castedParam.second ), castedParam.first ) ); } else if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) { match ( cli::Lexer::TokenType::DOLAR_SIGN ); std::unique_ptr < Arg > name = arg ( ); - return std::make_unique < VariableParam > ( std::move ( name ), false ); + return ext::make_pair ( move, std::make_unique < VariableParam > ( std::move ( name ) ) ); } else if ( check ( cli::Lexer::TokenType::HASH_SIGN ) ) { match ( cli::Lexer::TokenType::HASH_SIGN ); std::string value = getTokenValue ( ); match ( cli::Lexer::TokenType::INTEGER, cli::Lexer::TokenType::IDENTIFIER ); - return std::make_unique < ValueParam > ( std::make_unique < BindedArg > ( std::move ( value ) ) ); + return ext::make_pair ( move, std::make_unique < ValueParam > ( std::make_unique < BindedArg > ( std::move ( value ) ) ) ); } else { throw exception::CommonException ( "Mismatched set while expanding param rule." ); } @@ -218,18 +183,21 @@ std::shared_ptr < Statement > Parser::single_statement ( ) { // 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 ( ) ); - ext::vector < std::unique_ptr < cli::Arg > > templateParams; + ext::vector < std::unique_ptr < cli::Arg > > templateArgs; while ( check ( cli::Lexer::TokenType::AT_SIGN ) ) { - templateParams.emplace_back ( template_param ( ) ); + templateArgs.emplace_back ( template_arg ( ) ); } std::unique_ptr < CategoryOption > category = category_option ( ); ext::vector < std::unique_ptr < Param > > params; + ext::vector < bool > moves; while ( ! check ( cli::Lexer::TokenType::OUT_REDIRECT ) && ! check ( cli::Lexer::TokenType::PIPE_SIGN ) && ! check ( cli::Lexer::TokenType::END ) && ! check ( cli::Lexer::TokenType::RIGHT_PAREN ) ) { - params.emplace_back ( param ( ) ); + ext::pair < bool, std::unique_ptr < Param > > parameter = param ( ); + params.emplace_back ( std::move ( parameter.second ) );; + moves.push_back ( parameter.first ); } - return std::make_shared < SingleStatement > ( std::move ( name ), std::move ( templateParams ), std::move ( params ), std::move ( category ) ); + return std::make_shared < SingleStatement > ( std::move ( name ), std::move ( templateArgs ), std::move ( params ), std::move ( category ), std::move ( moves ) ); } else if ( check ( cli::Lexer::TokenType::STRING ) ) { std::string value = matchString ( ); return std::make_unique < ImmediateStatement < std::string > > ( value ); @@ -241,11 +209,14 @@ std::shared_ptr < Statement > Parser::single_statement ( ) { std::unique_ptr < TypeOption > type = type_option ( ); ext::vector < std::unique_ptr < Param > > params; + ext::vector < bool > moves; while ( ! check ( cli::Lexer::TokenType::RIGHT_BRACE ) ) { - params.emplace_back ( param ( ) ); + ext::pair < bool, std::unique_ptr < Param > > parameter = param ( ); + params.emplace_back ( std::move ( parameter.second ) );; + moves.push_back ( parameter.first ); } - std::shared_ptr < Statement > res = std::make_shared < ContainerStatement > ( "Set", std::move ( params ), std::move ( type ) ); + std::shared_ptr < Statement > res = std::make_shared < ContainerStatement > ( "Set", std::move ( params ), std::move ( type ), std::move ( moves ) ); match ( cli::Lexer::TokenType::RIGHT_BRACE ); return res; } else if ( check ( cli::Lexer::TokenType::HASH_SIGN ) ) { @@ -274,6 +245,11 @@ std::shared_ptr < StatementList > Parser::statement_list_cont ( ) { } void Parser::out_redirect ( std::shared_ptr < StatementList > & list ) { + if ( check ( cli::Lexer::TokenType::LEFT_BRACKET ) ) { + match ( cli::Lexer::TokenType::LEFT_BRACKET ); + std::unique_ptr < Arg > name = arg ( ); + match ( cli::Lexer::TokenType::RIGHT_BRACKET ); + } if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) { match ( cli::Lexer::TokenType::DOLAR_SIGN ); std::unique_ptr < Arg > name = arg ( ); @@ -325,13 +301,13 @@ std::unique_ptr < Command > Parser::introspect_command ( ) { match_nonreserved_kw ( "overloads" ); std::unique_ptr < cli::Arg > param = arg ( ); - ext::vector < std::unique_ptr < cli::Arg > > templateParams; + ext::vector < std::unique_ptr < cli::Arg > > templateArgs; while ( check ( cli::Lexer::TokenType::AT_SIGN ) ) { - templateParams.emplace_back ( template_param ( ) ); + templateArgs.emplace_back ( template_arg ( ) ); } match ( cli::Lexer::TokenType::END ); - return std::make_unique < OverloadsIntrospectionCommand > ( std::move ( param ), std::move ( templateParams ) ); + return std::make_unique < OverloadsIntrospectionCommand > ( std::move ( param ), std::move ( templateArgs ) ); } else if ( check_nonreserved_kw ( "datatypes" ) ) { match_nonreserved_kw ( "datatypes" ); std::unique_ptr < cli::Arg > param = optional_arg ( ); diff --git a/alib2cli/src/parser/Parser.h b/alib2cli/src/parser/Parser.h index 1db21e5e5c24904600e27bf1b4140490353ce153..ce122e4d047fef640f6ae32f3bebbc63aa739f98 100644 --- a/alib2cli/src/parser/Parser.h +++ b/alib2cli/src/parser/Parser.h @@ -90,17 +90,13 @@ public: std::unique_ptr < Arg > optional_arg ( ); + std::unique_ptr < Arg > template_arg ( ); + bool move_arg ( ); std::unique_ptr < Param > in_redirect_param ( ); - std::unique_ptr < Param > param ( ); - - std::unique_ptr < Arg > template_param ( ); - - std::unique_ptr < Param > move_param ( ); - - std::unique_ptr < Param > value_param ( ); + ext::pair < bool, std::unique_ptr < Param > > param ( ); std::shared_ptr < Statement > in_redirect_statement ( );