#ifndef PARSE_HPP #define PARSE_HPP #include "struc.hpp" #include #include #include #include #define SPACES " \t" #define SEPARATORS " \t\n" #define ARG_END " \t\n;#()&|<>" #define VARNAME_END " \t\n;#()&|=\"'\\{}/-+" #define BLOCK_TOKEN_END " \t\n;#()&|=\"'\\" #define COMMAND_SEPARATOR "\n;" #define CONTROL_END "#)" #define PIPELINE_END "\n;#()&" #define ARGLIST_END "\n;#()&|" #define SPECIAL_TOKENS "\n;#()&|" #define ALL_TOKENS "\n;#()&|{}" #define SPECIAL_VARS "!#*@$?" // bash specific #define ARRAY_ARG_END " \t\n;#()&|<>]" extern const std::vector posix_cmdvar; extern const std::vector bash_cmdvar; std::string import_file(std::string const& path); shmain* parse_text(const char* in, uint32_t size, std::string const& filename=""); inline shmain* parse_text(std::string const& in, std::string const& filename="") { return parse_text(in.c_str(), in.size(), filename); } inline shmain* parse(std::string const& file) { return parse_text(import_file(file), file); } // ** unit parsers ** // /* util parsers */ // list std::pair parse_list_until(const char* in, uint32_t size, uint32_t start, char end_c, const char* expecting=NULL); std::pair parse_list_until(const char* in, uint32_t size, uint32_t start, std::string const& end_word); std::tuple parse_list_until(const char* in, uint32_t size, uint32_t start, std::vector const& end_words, const char* expecting=NULL); // name std::pair parse_var(const char* in, uint32_t size, uint32_t start, bool specialvars=true, bool array=false); // subarg parsers std::pair parse_arithmetic(const char* in, uint32_t size, uint32_t start); std::pair parse_manipulation(const char* in, uint32_t size, uint32_t start); // arg parser std::pair parse_arg(const char* in, uint32_t size, uint32_t start, const char* end=ARG_END, const char* unexpected=SPECIAL_TOKENS, bool doquote=true); // redirect parser std::pair parse_redirect(const char* in, uint32_t size, uint32_t start); // arglist parser std::pair parse_arglist(const char* in, uint32_t size, uint32_t start, bool hard_error=false, std::vector* redirs=nullptr); // block parsers std::pair parse_block(const char* in, uint32_t size, uint32_t start); std::pair parse_cmd(const char* in, uint32_t size, uint32_t start); std::pair parse_function(const char* in, uint32_t size, uint32_t start, const char* after="()"); std::pair parse_subshell(const char* in, uint32_t size, uint32_t start); std::pair parse_brace(const char* in, uint32_t size, uint32_t start); std::pair parse_case(const char* in, uint32_t size, uint32_t start); std::pair parse_if(const char* in, uint32_t size, uint32_t start); std::pair parse_for(const char* in, uint32_t size, uint32_t start); std::pair parse_while(const char* in, uint32_t size, uint32_t start); // pipeline parser std::pair parse_pipeline(const char* in, uint32_t size, uint32_t start); // condlist parser std::pair parse_condlist(const char* in, uint32_t size, uint32_t start); #endif //PARSE_HPP