aboutsummaryrefslogtreecommitdiff
path: root/include/lexer/ast.h
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-09-09 10:57:22 +0000
committer_ov4 <ov4@ov4.org>2026-09-09 10:57:22 +0000
commit7ec58e8db1096e7916f99b84011ddb13a010da75 (patch)
treee3da5c2c45a53881e5c86d5a6b53b48c178684db /include/lexer/ast.h
parent39715efcc89480be7e1c4f89946c680e05496a25 (diff)
separate compilation
Diffstat (limited to 'include/lexer/ast.h')
-rw-r--r--include/lexer/ast.h134
1 files changed, 0 insertions, 134 deletions
diff --git a/include/lexer/ast.h b/include/lexer/ast.h
index b823c09..3434aa3 100644
--- a/include/lexer/ast.h
+++ b/include/lexer/ast.h
@@ -22,138 +22,4 @@ public:
size_t right = string::npos;
};
-string T_lexer::final_trim(size_t _begin, size_t _end)
-{
- string s;
- for (size_t i = _begin; i < _end; i++)
- {
- if (token[i].token_type != TEXT)
- continue;
- s += token[i].text + " ";
- }
- s = s.substr(0, s.size()-1); // eat final space
- return s;
-}
-
-size_t T_lexer::alloc_ast()
-{
- ast.emplace_back();
- return ast_index++;
-}
-
-int T_lexer::get_pivot_order(enum_token_type x)
-{
- string s = symbol_enum2string(x);
- if (s != "")
- {
- return symbol_property[s].pivot_priority;
- }
- // not found
- return -1;
-}
-
-bool T_lexer::is_operator(enum_token_type x)
-{
- switch(x)
- {
- case LOGIC_AND:
- case LOGIC_OR:
- case PIPE:
- case ASYNC:
- return true;
- default:
- return false;
- }
-}
-
-// region [begin, end)
-void T_lexer::parse(size_t cmd_begin, size_t cmd_end, size_t ast_vec)
-{
- int current_depth = 0;
- int current_order = -1;
- int max_depth = -1;
- size_t found_pos = string::npos;
-
- for (size_t i = cmd_begin; i < cmd_end; i++)
- {
- if (token[i].bracket_depth > max_depth)
- max_depth = token[i].bracket_depth;
- }
-
-
- while (found_pos == string::npos)
- {
- // scan from right to left
- for (size_t i = cmd_end - 1; i >= cmd_begin && i < cmd_end; i--)
- {
- // if same depth
- // and higher order number
- if (token[i].bracket_depth == current_depth
- && is_operator(token[i].token_type)
- && get_pivot_order(token[i].token_type) > current_order)
- {
- current_order = get_pivot_order(token[i].token_type);
- found_pos = i;
- println("Found pos: {} order: {} depth: {}", i, current_order, current_depth);
- }
- }
- current_depth++;
- if (current_depth > max_depth)
- {
- break;
- }
- }
-
- if (found_pos == string::npos)
- {
- println("Smallest unit");
- ast[ast_vec].token_type = TEXT;
- ast[ast_vec].command_text = final_trim(cmd_begin, cmd_end);
- return;
- }
-
- // left child
-
- string token_str = symbol_enum2string(token[found_pos].token_type);
-
- // miss left
- if (symbol_property[token_str].left == EXIST && cmd_begin == found_pos)
- {
- println("parse: missing left child");
- exit(-1); // TODO
- }
-
- // miss right
- if (symbol_property[token_str].right == EXIST && cmd_end-1 == found_pos)
- {
- println("parse: missing right child");
- exit(-1); // TODO
- }
-
- // should not exist left
- if (symbol_property[token_str].left == NOT_EXIST && cmd_begin != found_pos)
- {
- println("parse: left child should NOT exist");
- exit(-1); // TODO
- }
-
- // should not exist right
- if (symbol_property[token_str].right == NOT_EXIST && cmd_end-1 != found_pos)
- {
- println("parse: right child should NOT exist");
- exit(-1); // TODO
- }
-
- size_t l = alloc_ast();
- size_t r = alloc_ast();
- ast[ast_vec].left = l;
- ast[ast_vec].right = r;
- ast[ast_vec].token_type = token[found_pos].token_type;
-
- println("Parse sub: {}, {}, {}", cmd_begin, found_pos, cmd_end);
-
- parse(cmd_begin, found_pos, l);
- parse(found_pos+1, cmd_end, r);
-}
-
}