Newer
Older
#include <ast/statements/CastStatement.h>
#include <ast/statements/SingleStatement.h>
#include <ast/statements/ResultFileStatement.h>
#include <ast/statements/ResultVariableStatement.h>
#include <ast/statements/ResultPrintStatement.h>
#include <ast/statements/VariableStatement.h>
#include <ast/statements/ValueStatement.h>
#include <ast/statements/FileStatement.h>
#include <ast/params/StatementParam.h>
#include <ast/params/FileParam.h>
#include <ast/params/ImmediateParam.h>
#include <ast/params/PreviousResultParam.h>
#include <ast/params/ValueParam.h>
#include <ast/params/VariableParam.h>
#include <ast/params/CastParam.h>
#include <ast/args/BindedArg.h>
#include <ast/args/ImmediateArg.h>
#include <command/ExecuteCommand.h>
#include <command/QuitCommand.h>
#include <ast/options/HL3Option.h>
#include <primitive/Integer.h>
#include <primitive/String.h>
namespace cli {
std::unique_ptr < Option > Parser::option ( ) {
match ( cli::Lexer::TokenType::COLON_SIGN );
if ( check_nonreserved_kw ( "hl3" ) ) {
match_nonreserved_kw ( "hl3" );
return std::make_unique < HL3Option > ( );
} else {
throw exception::CommonException ( "Mismatched set while expanding option rule." );
}
}
std::unique_ptr < Arg > Parser::arg ( ) {
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 < BindedArg > ( std::move ( value ) );
} else {
std::string value = matchIdentifier ( );
return std::make_unique < ImmediateArg > ( value );
}
}
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 ( ) );
match ( cli::Lexer::TokenType::RIGHT_PAREN );
return sub_statement;
} else {
std::unique_ptr < Arg > file = arg ( );
return std::make_unique < FileParam > ( std::move ( file ) );
}
}
std::unique_ptr < Param > Parser::param ( ) {
if ( check ( cli::Lexer::TokenType::DASH_SIGN ) ) {
match ( cli::Lexer::TokenType::DASH_SIGN );
return std::make_unique < PreviousResultParam > ( );
} 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::INTEGER ) ) {
int value = matchInteger ( );
return 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 ) );
} 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 ) );
} 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 ) ) );
throw exception::CommonException ( "Mismatched set while expanding param rule." );
std::shared_ptr < Statement > Parser::single_statement ( ) {
if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) {
match ( cli::Lexer::TokenType::DOLAR_SIGN );
std::unique_ptr < Arg > name = arg ( );
return std::make_shared < VariableStatement > ( std::move ( name ) );
} else if ( check ( cli::Lexer::TokenType::IN_REDIRECT ) ) {
match ( cli::Lexer::TokenType::IN_REDIRECT );
std::unique_ptr < Arg > file = arg ( );
return std::make_unique < FileStatement > ( std::move ( file ) );
} 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::shared_ptr < Statement > casted_statement = single_statement ( );
return std::make_shared < CastStatement > ( std::move ( type ), casted_statement );
} else if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) {
std::unique_ptr < Arg > name = std::make_unique < ImmediateArg > ( matchIdentifier ( ) );
ext::vector < std::unique_ptr < Option > > options;
while ( check ( cli::Lexer::TokenType::COLON_SIGN ) ) {
options.emplace_back ( option ( ) );
}
ext::vector < std::unique_ptr < Param > > params;
while ( ! check ( cli::Lexer::TokenType::OUT_REDIRECT ) && ! check ( cli::Lexer::TokenType::HASH_SIGN ) && ! check ( cli::Lexer::TokenType::PIPE_SIGN ) && ! check ( cli::Lexer::TokenType::END ) && ! check ( cli::Lexer::TokenType::RIGHT_PAREN ) ) {
params.emplace_back ( param ( ) );
}
return std::make_shared < SingleStatement > ( std::move ( name ), std::move ( params ), std::move ( options ) );
} 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_shared < ValueStatement > ( std::make_unique < BindedArg > ( std::move ( value ) ) );
throw exception::CommonException ( "Mismatched set while expanding param single_statement." );
std::shared_ptr < StatementList > Parser::statement_list ( ) {
std::shared_ptr < Statement > statement = single_statement ( );
return std::make_shared < StatementList > ( statement, statement_list_cont ( ) );
}
std::shared_ptr < StatementList > Parser::statement_list_cont ( ) {
if ( check ( cli::Lexer::TokenType::PIPE_SIGN ) ) {
match ( cli::Lexer::TokenType::PIPE_SIGN );
std::shared_ptr < Statement > statement = single_statement ( );
return std::make_shared < StatementList > ( statement, statement_list_cont ( ) );
} else {
return nullptr;
}
}
void Parser::out_redirect ( std::shared_ptr < StatementList > & list ) {
if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) {
match ( cli::Lexer::TokenType::DOLAR_SIGN );
std::unique_ptr < Arg > name = arg ( );
list->append ( std::make_unique < ResultVariableStatement > ( std::move ( name ) ) );
} else if ( check ( cli::Lexer::TokenType::END ) ) {
} else {
std::unique_ptr < Arg > file = arg ( );
list->append ( std::make_unique < ResultFileStatement > ( std::move ( file ) ) );
void Parser::result ( std::shared_ptr < StatementList > & list ) {
if ( check ( cli::Lexer::TokenType::OUT_REDIRECT ) ) {
match ( cli::Lexer::TokenType::OUT_REDIRECT );
} else if ( check ( cli::Lexer::TokenType::END ) ) {
list->append ( std::make_unique < ResultPrintStatement > ( ) );
if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) {
return matchIdentifier ( );
} else {
return "";
}
}
std::unique_ptr < Command > Parser::parse ( ) {
if ( check_nonreserved_kw ( "execute" ) ) {
match_nonreserved_kw ( "execute" );
std::shared_ptr < StatementList > res = statement_list ( );
result ( res );
match ( cli::Lexer::TokenType::END );
return std::make_unique < ExecuteCommand > ( res );
} else if ( check_nonreserved_kw ( "quit" ) ) {
match_nonreserved_kw ( "quit" );
match ( cli::Lexer::TokenType::END );
return std::make_unique < QuitCommand > ( );
} else if ( check_nonreserved_kw ( "help" ) ) {
match_nonreserved_kw ( "help" );
match ( cli::Lexer::TokenType::END );
return std::make_unique < HelpCommand > ( std::move ( command ) );
} else if ( check_nonreserved_kw ( "introspect" ) ) {
match_nonreserved_kw ( "introspect" );
std::string command = optional_identifier ( );
match ( cli::Lexer::TokenType::END );
return std::make_unique < IntrospectionCommand > ( std::move ( command ) );
} else if ( check_nonreserved_kw ( "set" ) ) {
match_nonreserved_kw ( "set" );
std::string param = matchIdentifier ( );
std::string value = getTokenValue ( );
match ( cli::Lexer::TokenType::INTEGER, cli::Lexer::TokenType::IDENTIFIER );
match ( cli::Lexer::TokenType::END );
return std::make_unique < SetCommand > ( std::move ( param ), std::move ( value ) );
throw exception::CommonException ( "Mismatched set while expanding parse rule." );
}
} /* namespace cli */