aboutsummaryrefslogtreecommitdiff
path: root/include/lang_analysis
diff options
context:
space:
mode:
Diffstat (limited to 'include/lang_analysis')
-rw-r--r--include/lang_analysis/ast.h30
-rw-r--r--include/lang_analysis/enum_type.h35
-rw-r--r--include/lang_analysis/lexer_class.h42
-rw-r--r--include/lang_analysis/parseline.h10
-rw-r--r--include/lang_analysis/symbol_property.h48
-rw-r--r--include/lang_analysis/token.h25
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;
+};
+
+}