diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp index 5743399a30b07690746f9b02f8781fb3e6b71e40..5af3d5e9bada0f3a14b5a21c80dc26aabac994c3 100644 --- a/alib2cli/src/parser/Parser.cpp +++ b/alib2cli/src/parser/Parser.cpp @@ -412,6 +412,26 @@ std::unique_ptr < Expression > Parser::batch_or_expression ( ) { } } +std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > Parser::qualifiedType ( ) { + abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet = abstraction::ParamQualifiers::ParamQualifierSet::NONE; + if ( check_nonreserved_kw ( "const" ) ) { + match_nonreserved_kw ( "const" ); + paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::CONST; + } + + std::unique_ptr < Arg > type = arg ( ); + + if ( check ( cli::Lexer::TokenType::AND_OPERATOR ) ) { + match ( cli::Lexer::TokenType::AND_OPERATOR ); + paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::RREF; + } else if ( check ( cli::Lexer::TokenType::AMPERSAND_SIGN ) ) { + match ( cli::Lexer::TokenType::AMPERSAND_SIGN ); + paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::LREF; + } + + return std::make_pair ( paramQualifierSet, std::move ( type ) ); +} + std::unique_ptr < Command > Parser::command ( ) { clearCheckOptions ( ); if ( check_nonreserved_kw ( "execute" ) ) { @@ -540,22 +560,7 @@ std::unique_ptr < Command > Parser::command ( ) { } else if ( check_nonreserved_kw ( "declare" ) ) { match_nonreserved_kw ( "declare" ); - abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet = abstraction::ParamQualifiers::ParamQualifierSet::NONE; - - if ( check_nonreserved_kw ( "const" ) ) { - match_nonreserved_kw ( "const" ); - paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::CONST; - } - - match_nonreserved_kw ( "auto" ); - - if ( check ( cli::Lexer::TokenType::AND_OPERATOR ) ) { - match ( cli::Lexer::TokenType::AND_OPERATOR ); - paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::RREF; - } else if ( check ( cli::Lexer::TokenType::AMPERSAND_SIGN ) ) { - match ( cli::Lexer::TokenType::AMPERSAND_SIGN ); - paramQualifierSet = paramQualifierSet | abstraction::ParamQualifiers::ParamQualifierSet::LREF; - } + std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > qualType = qualifiedType ( ); match ( cli::Lexer::TokenType::DOLAR_SIGN ); std::unique_ptr < Arg > name = arg ( ); @@ -564,7 +569,7 @@ std::unique_ptr < Command > Parser::command ( ) { std::unique_ptr < Expression > expr = expression ( ); - return std::make_unique < VarDeclareCommand > ( std::move ( name ), paramQualifierSet, std::move ( expr ) ); + return std::make_unique < VarDeclareCommand > ( std::move ( name ), qualType.first, std::move ( expr ) ); } else { throw exception::CommonException ( "Mismatched set " + ext::to_string ( getCheckOptions ( ) ) + " while expanding parse rule. Token is " + ( ( std::string ) m_current ) + "." ); } diff --git a/alib2cli/src/parser/Parser.h b/alib2cli/src/parser/Parser.h index f40642b1722188e0c0528d3d91fae085b9eae71d..831e870e9ba59355a8cd727ede860e5f2ff2948f 100644 --- a/alib2cli/src/parser/Parser.h +++ b/alib2cli/src/parser/Parser.h @@ -229,6 +229,10 @@ public: std::unique_ptr < Expression > batch_or_expression ( ); + std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > qualifiedType ( ); + + std::pair < abstraction::ParamQualifiers::ParamQualifierSet, std::unique_ptr < Arg > > runnableParam ( ); + std::unique_ptr < Command > command ( ); std::unique_ptr < Command > semicolon_command ( );