Open Giromi opened 2 years ago
minishell$> echo && ls | what || helokjf || here is || < a < dfdf < fdf > dfdf hohif | < t*.o what | *.c && what
------------------------------------------------------------------------------------------------------------------
[echo] → [&&] → [ls] → [|] → [what] → [||] → [helokjf] → [||] → [here] → [is] → [||] → [<] → [a] → [<] → [dfdf] → [<] → [fdf] → [>] → [dfdf] → [hohif] → [|] → [<] → [terminal_setting.o] → [what] → [|] → [origin_str_utils2.c] → [origin_str_utils.c] → [error_utils.c] → [terminal_setting.c] → [linked_list_utils.c] → [origin_putfd_utils.c] → [custom_str_utils.c] → [debug_print_tree.c] → [minishell_utils.c] → [minishell.c] → [&&] → [what] → [(null)]
[(null)] ← [what] ← [&&] ← [minishell.c] ← [minishell_utils.c] ← [debug_print_tree.c] ← [custom_str_utils.c] ← [origin_putfd_utils.c] ← [linked_list_utils.c] ← [terminal_setting.c] ← [error_utils.c] ← [origin_str_utils.c] ← [origin_str_utils2.c] ← [|] ← [what] ← [terminal_setting.o] ← [<] ← [|] ← [hohif] ← [dfdf] ← [>] ← [fdf] ← [<] ← [dfdf] ← [<] ← [a] ← [<] ← [||] ← [is] ← [here] ← [||] ← [helokjf] ← [||] ← [what] ← [|] ← [ls] ← [&&] ← [echo]
&&
/ \
/ \
|| CMD
/ \ \
/ \ what
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
|| |
/ \ / \
/ \ / \
/ \ / \
|| CMD / \
/ \ \ / \
/ \ here is / \
/ \ / \
&& CMD / \
/ \ \ / \
/ \ helokjf / \
/ \ / \
/ \ / \
CMD | / \
\ / \ / \
echo / \ / \
/ \ / \
CMD CMD / \
\ \ / \
ls what / \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
| CMD
/ \ \
/ \ origin_str_utils2.c origin_str_utils.c error_utils.c terminal_setting.c linked_list_utils.c origin_putfd_utils.c custom_str_utils.c debug_print_tree.c minishell_utils.c minishell.c
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
CMD CMD
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ < terminal_setting.o what
< a < dfdf < fdf > dfdf hohif
minishell$> (here is || < a < dfdf < fdf) > dfdf fdfd
---------------------------------------------------------------
[(] → [here] → [is] → [||] → [<] → [a] → [<] → [dfdf] → [<] → [fdf] → [)] → [>] → [dfdf] → [fdfd] → [(null)]
[(null)] ← [fdfd] ← [dfdf] ← [>] ← [)] ← [fdf] ← [<] ← [dfdf] ← [<] ← [a] ← [<] ← [||] ← [is] ← [here] ← [(]
CMD
/ \
/ \
/ \
/ \
> dfdf ( fdfd
/
CMD
\
here is || < a < dfdf < fdf )
------------------------------------------------------
minishell$> (here is || < a < dfdf < fdf sdf dsf sd) > dfd
CMD
/ \
/ \
/ \
> dfd ( )
/
||
/ \
/ \
/ \
/ \
/ \
/ \
/ \
CMD CMD
\ / \
< a < dfdf < fdf / \
/ \
/ \
/ \
/ \
/ \
< a < dfdf < fdf sdf dsf sd
------------------------------------------------------
< 탐색하기 >
recur_search_handle_tree(t_tree *root_node, int tree_type, void (* handler)(t_tree *))
{
if (type == tree_type)
handler 함수
recursive_tree(cur->left);
recursive_tree(cur->right);
}
< undefined tree 수정하기 handle 함수 >
void making_tree_node(t_tree *root, is_type)
// 1. make_tree(token_list); <- token_list : 제일 첫 토큰
// 2. root_tree 부터 left 우선 -> 재귀
2-1. AND, OR 찾기 (while cur_node != head_token)
2-1-1 찾음
현재 노드 TYPE = UNDEFINED => 이 노드를 수정해야 합니다.
1. TYPE 수정 (TREE_AND)
2. right에 tree할당
a. TYPE = UNDEFINED
3. left tree 할당
a. TYPE = AND || OR
b. PARENT = 현재 트리
c. token_data = 기존 token_data
4. token_data = pop_node
5. right->token_data = cut_back
6. 다시 앞으로가면서 찾기 시작
// B. 현재 노드 TYPE != UNDEFINED => left를 할당해야 합니다.
// b. left tree로 이동
// c. token_data = pop_node
// d. right에 tree할당(TYPE = UNDEFINED)
// e. right->token_data = cut_back
// f. 다시 앞으로가면서 찾기 시작
2-1-2 못찾음
2-1-2-1 현재 트리 TYPE != UNDEFINED -> left tree 할당 (TYPE = UNDEFINED) (PARENT = 현재 트리) left tree-left 현재 토큰 주소(첫 주소)
2-1-2-2 현재 트리 TYPE == UNDEFINED (아예 못찾음) -> 아무것도 안함
3-1. PIPE 찾기
상동
4-1. CMD
4-1-1. REDI
트리에 사용할 구조체
enum e_tree_type { TREE_AND = 30, : [left, right] - [ 다양, 다양(&&, || X) ] TREE_OR, : [left, right] - [ 다양, 다양(&&, || X) ] TREE_PIPE, : [left, right] - [ (CMD, PIPE), CMD ] TREE_CMD, : [left, right] - [ REDI, (SIMPLE_CMD, SUBSHELL) ] TREE_REDI, : [left, right] - [ X ] TREE_SIMPLE_CMD, : [left, right] - [ X ] TREE_SUBSHELL : [left, right] - [ 다양, X] }
typedef struct s_tree { int type; t_lx_token token_data; struct s_tree parent_tree; struct s_tree left struct s_tree right; } t_tree;
트리 구현