diff options
Diffstat (limited to 'include/lang_analysis')
| -rw-r--r-- | include/lang_analysis/ast.h | 30 | ||||
| -rw-r--r-- | include/lang_analysis/enum_type.h | 35 | ||||
| -rw-r--r-- | include/lang_analysis/lexer_class.h | 42 | ||||
| -rw-r--r-- | include/lang_analysis/parseline.h | 10 | ||||
| -rw-r--r-- | include/lang_analysis/symbol_property.h | 48 | ||||
| -rw-r--r-- | include/lang_analysis/token.h | 25 |
6 files changed, 190 insertions, 0 deletions
diff --git a/include/lang_analysis/ast.h b/include/lang_analysis/ast.h new file mode 100644 index 0000000..9e5a717 --- /dev/null +++ b/include/lang_analysis/ast.h @@ -0,0 +1,30 @@ +#pragma once + +#include <string> + +#include "lang_analysis/lexer_class.h" +#include "lang_analysis/enum_type.h" +#include "lang_analysis/token.h" + +using namespace std; // remove this + +namespace ov4 +{ + +class T_lexer::T_ast +{ +public: + T_ast() = default; + + enum_token_type token_type; + string command_text; + size_t left = string::npos; + size_t right = string::npos; + + // if this is marked as `subshell` + // it will fork a subshell + // then the subshell will handler the rest + bool subshell; +}; + +} diff --git a/include/lang_analysis/enum_type.h b/include/lang_analysis/enum_type.h new file mode 100644 index 0000000..bfc7cdc --- /dev/null +++ b/include/lang_analysis/enum_type.h @@ -0,0 +1,35 @@ +#pragma once + +namespace ov4 +{ + +enum enum_token_type +{ + TEXT, // foo + SINGLE_QUOTATION, // ' + DOUBLE_QUOTATION, // " + LOGIC_AND, // && + LOGIC_OR, // || + ASYNC, // & + PIPE, // | + SEMICOLON, // ; + EXPAND, // $ + LEFT_BRACKET, // ( + RIGHT_BRACKET, // ) +}; + +enum guard_type +{ + GUARD_OFF, + GUARD_WEAK, + GUARD_STRONG, +}; + +enum class child_existence_type +{ + NOT_EXIST, + OPTIONAL, + EXIST, +}; + +} diff --git a/include/lang_analysis/lexer_class.h b/include/lang_analysis/lexer_class.h new file mode 100644 index 0000000..4100b97 --- /dev/null +++ b/include/lang_analysis/lexer_class.h @@ -0,0 +1,42 @@ +#pragma once + +#include <string> +#include <unordered_map> +#include <vector> + +#include "lang_analysis/enum_type.h" + +using namespace std; + +namespace ov4 +{ + +class T_lexer +{ +public: + + // token.h + class T_token; + string trim(const string &s, const string &trim_target = " \t"); + bool is_single_symbol(char c); + void bracket_depth_changer(char c, int &bracket_depth); + bool token_continue(const string &s, char next); + void token_push(const string &push_s, int bracket_depth, bool force_text = false); + int tokenizer(const string &s); + + // ast.h + class T_ast; + string final_trim(size_t _begin, size_t _end); + size_t alloc_ast(); + int get_pivot_order(enum_token_type x); + bool is_operator(enum_token_type x); + void parse(size_t cmd_begin, size_t cmd_end, size_t ast_vec); + + // shared + std::vector<T_ast> ast; + std::vector<T_token> token; + size_t ast_index = 0; + +}; + +} diff --git a/include/lang_analysis/parseline.h b/include/lang_analysis/parseline.h new file mode 100644 index 0000000..e52b50e --- /dev/null +++ b/include/lang_analysis/parseline.h @@ -0,0 +1,10 @@ +#pragma once + +#include <string> + +namespace ov4 +{ + +char **parseline(const std::string &s); + +} diff --git a/include/lang_analysis/symbol_property.h b/include/lang_analysis/symbol_property.h new file mode 100644 index 0000000..f21b145 --- /dev/null +++ b/include/lang_analysis/symbol_property.h @@ -0,0 +1,48 @@ +#pragma once + +#include <unordered_map> +#include <string> + +#include "lang_analysis/enum_type.h" + +using namespace std; + +namespace ov4 +{ + +class T_property +{ +public: + bool continuable = true; + + // -1 means it's NOT operator + // any positive values mean it's operator + int pivot_priority = -1; + + // require: MUST + // accept: optional, but if it doesn't accept, but there is indeed a child, then error + child_existence_type left; + child_existence_type right; + + enum_token_type enum_type = TEXT; +}; + +inline const unordered_map<string, T_property> symbol_property = { + + // bracket + {"(", {.continuable = false, .enum_type = LEFT_BRACKET}}, + {")", {.continuable = false, .enum_type = RIGHT_BRACKET}}, + + // operator + {"&", {.continuable = true, .pivot_priority = 2000, .left = child_existence_type::EXIST, .right = child_existence_type::NOT_EXIST, .enum_type = ASYNC}}, + {"|", {.continuable = true, .pivot_priority = 100, .left = child_existence_type::EXIST, .right = child_existence_type::EXIST, .enum_type = PIPE}}, + {"&&", {.continuable = true, .pivot_priority = 1000, .left = child_existence_type::EXIST, .right = child_existence_type::EXIST, .enum_type = LOGIC_AND}}, + {"||", {.continuable = true, .pivot_priority = 1000, .left = child_existence_type::EXIST, .right = child_existence_type::EXIST, .enum_type = LOGIC_OR}}, + +}; + +string symbol_enum2string(enum_token_type e); + +bool symbol_contains_enum_type(enum_token_type e); + +} diff --git a/include/lang_analysis/token.h b/include/lang_analysis/token.h new file mode 100644 index 0000000..508d142 --- /dev/null +++ b/include/lang_analysis/token.h @@ -0,0 +1,25 @@ +#pragma once + +#include <string> + +#include "lang_analysis/lexer_class.h" +#include "lang_analysis/enum_type.h" +#include "lang_analysis/symbol_property.h" + +using namespace std; // remove this + +namespace ov4 +{ + +class T_lexer::T_token +{ +public: + T_token() = default; + + enum_token_type token_type; + string text; + guard_type guard = GUARD_OFF; + int bracket_depth = 0; +}; + +} |
