-
Notifications
You must be signed in to change notification settings - Fork 1
Trace
Lexer -> 공백 문자 or 메타캐릭터 기준으로 토큰을 잘라줌
-> 해당 토큰의 token_str 전체를 하나로 받아서
커서를 하나하나 움직이면서 확장이 필요
- 상황이 나오면 토큰으로 만들면서 나간다
a. 따옴표에 둘러싸여있으면 무조건 가짜 공백
b. 분리될 가능성이 있는 해석 심볼은 *, $
" a b "
c. 무조건 현재 노드 수정 후 제작 후 이동
c-1. 내 노드가 다음에 올 것과 분리되어야할 토큰이다 -> 빈 새 노드 붙이고 거기로 이동 (ex) " a b "/ a b /
c-2 내 노드가 다음에 올 것과 붙어야할 토큰이다 -> 내 노드에서 그대로 종료 (ex) " a b"/ a b/
- 해석이 필요한 모든 부분을 문자열로 붙여서 분리
- ~
-
단독
-
뒤에 / 일 때만 해석
minsuki2 수정사항
-
line_handler -> liner
: 문맥상 통일된다고 생각 -
liner 소괄호 에러 문제 해결... _cnt_parentheses_flag 함수 제작
-> (set_parentheses_flag 함수 안 쓰는데 그냥 대체?) -
close error 함수 따로 제작
-
자세한 close 케이스는 아래 주소에 정리 해놓음
2022.09.02 - liner close handle
수정사항 팔로업
맨 첫 노드의 prev에 해당 리스트 마지막 주소 넣기로 합의
해야할 일
- 리스트 핸들 함수 만들기
- t_lx_token *cut_back_node(t_lx_token *cur_node)
- t_lx_token *cut_front_node(t_lx_token *cur_node)
- t_lx_token *pop_node(t_lx_token *cur_node)
- 함수 포인터를 이용한 handle 함수(is_target_token(), apply_action())
- is_target_token : AND_IF/OR_IF, PIPE
- apply_action : cut_back, pop_node
- 트리 만들기
&&, ||
PIPE
[CMD -> REDIRECT, SIMPLE_CMD] OR [SUBSHELL -> 위에 작업 순서대로 다시]
minsuki2 얘기
- _file_to_node 줄 수 + 가독성을 위해 continue 어떰?
- lexer 함수 while 끝나고 priv연결 못함 cur이 마지막으로 가있지 않음 ⇒ while문제 token_cur 추가
- 괄호가 )으로 닫힌거는 lexer 에러로 판단 하지 않는?
- priv 완성
- 그냥 libft 폴더 만들면 안됨?
dollar tilde 혼합 사용 관련 오류 수정 echo $ -> $
// dollar chunk뒤에 널문자이면 dollar를 그대로 출력해줌
관련해서 코드 수정 후 일관성 있는 동작으로 다시 수정
*chunk 나누는 기준 다시 정리
DOLLAR : interpret_symbol 만나면 그 전까지 잘라서 줌
TILDE : 무조건 자신과 다음 글자만 가져감(무조건 2글자 chunk)
*TILDE translator 체크하는 부분
- token_str의 첫 글자가 ~인가
- chunk의 다음 글자가 널문자 또는 '/'인가
=> 문제점 : // ... 같은 경우 전부 해석 됨
- (추가) interpreted_str이 널인가
// why? TILDE가 여러개의 경우 무조건 2글자씩 잘라서 해석하기 때문에 interpreted_str에는 값이 들어가있을 수 밖에 없음
// 그래서 내 chunk가 token_str의 시작과 같은지 확인할 수 있게 됨
wildcard 해석 함수 완료 파싱 시작 앞으로 우리가 해야될 일
- 연결리스트 양방향으로 만들기
- 에러 처리(>, >>, <, <<, (, ), |, &&, ||)
- 트리 만들기
&&, ||
PIPE
[CMD -> REDIRECT, SIMPLE_CMD] OR [SUBSHELL -> 위에 작업 순서대로 다시]
- pipe, executor 구현
wildcard 해석 함수 작업 norm 작업
check lexer issue #5 ~ 해석 대응 작업
- 단독 ~, ~로 시작 + 바로 뒷 글자 '/'
- 위 케이스가 아닌 ~
- $~ 케이스
- $[WORD]~ 케이스
- wildcard translator 제작 완료
< yasjeon 할일 >
✔️ 재귀 함수 md -> c언어 만들기
✔️ ft_strjoin 만들기
minuski2 할일
✔️ is_matching_file wildcard_flag 만들기
✔️ 파일 하나로 합치기
Function name : wildcard_translator
Return value : void
Action : cur를 가지고 들어가서 해석한 값으로 바꾸고 맨 뒤로 땡겨줘야 됨
Arguments : t_lx_token **cur,
example : **///***/*** <- token_str
1. char *_compress_wildcard(t_lx_token *cur)
1-1. '/' 압축
return : char *압축된 문자열 -> "*/*/*"
2. split by '/'
*/, */, *
3. 목표 계층 설정 : target_level
* 갯수 세기 - 1 -> 2
4. pwd 설정
head 세팅
5. 재귀 함수 시작
Return value : void
Action : 파일 경로/이름 연결리스트 만들어 줌
Arguments : t_lx_token **cur, const int target_level, int cur_level, char *pwd
재귀 탈출 조건 : cur_level == target_level(노드 생성) || cur_level < target_level && get_files_cur_pwd의 return이 NULL(생성 X)
prev -> cur(token : **/**/**/**)
interp : lexer.c
head(lexer.c) -> next(liner.c) -> ...
ft_strchr("/") : -> dir_flag
t_file *get_files_cur_pwd(const char *cur_pwd, int dir_flag) : cur_pwd 파일/디렉토리 받아오기
int is_matching_file(char *input, t_file * const files, int dir_flag) : cur_pwd 파일/디렉토리에서 text matching 되는 애들 t_file의 플래그 켜주기
Arguments : input(*, */, word 가능), files
---------------------------------------------
/lexer/
ㄴlexer.c
ㄴliner.c
ㄴtest_dir/
ㄴnice.c
ㄴpipe.c
ㄴmore_dir/
ㄴmore_nice.c
ㄴmore_pipe.c
ㄴabc_dir
ㄴabc_nice.c
ㄴabc_pipe.c
ㄴempty_dir/
---------------------------------------------
재귀 시작
input : */*/*
pwd : /lexer
target_level : 2
cur_level : 0
----------------------------------------------
1회차
pwd : /lexer
files-1 : /lexer/test_dir
files-2 : /lexer/empty_dir
target_level : 2
cur_level : 0
----------------------------------------------
1-1회차
pwd : /lexer/test_dir
files-1 : /lexer/test_dir/more_dir
target_level : 2
cur_level : 1
----------------------------------------------
1-1-1회차
pwd : /lexer/test_dir/more_dir
files-1 : more_nice.c
files-2 : more_pipe.c
target_level : 2
cur_level : 2 -> 79 line
----------------------------------------------
files = *get_files_cur_pwd(const char *cur_pwd, int dir_flag)
if (cur_level == target_level)
{
while (files)
if (token_str != NULL)
cur_node 수정
else
{
------------------------------ 별도 함수
cur_node->next 에 malloc
cur_node->next 작성
cur_node->interpret_symbol 작성
cur_node->interpreted_str 작성
------------------------------
cur_node = cur_node->next
}
return ;
}
else -> dir_flag = TRUE
{
if (files == NULL)
return ;
else
{
while (files->n)
{
pwd 재설정
재귀 함수 호출(cur_level++, 바뀐 pwd)
}
}
return ;
// return 전에 pwd free
}
//6. 재귀에서 던져준 연결리스트 head의 interpreted_str, next를 cur에 입혀주고 head는 free
6. cur 이중포인터로 넘겨서 해결
//7. cur를 next가 NULL일 때 까지 맨 뒤로 땡김
yasjeon 할일
- 재귀 함수 md -> c언어 만들기
- ft_strjoin 만들기
minuski2 할일
- is_matching_file wildcard_flag 만들기
- 파일 하나로 합치기
d
working : [0][1][2][3] [1] : test_dir/
| d [0] [1] [2] [3] [4]
[0][1][2][3][4] a.out hello nice/ what.txt test/
|
[0][1][2] hello.c good.js lsl.a who.c
working : [0][1][2][3] [1] : test_dir/
| d [0] [1]
[0] [1] nice/ test/
| |
[0][1][2] [0] hello.c good.js lsl.a
files[0] --- files[2]
files[1] --- files
files->n
t_lx_token *node
/*
v
input : hello* < 39 line
v
name : hello123
v
input : hello* << 41 line
v
name : hello
v
input : hello*abc << 42 line
v
name : hello123abc << 43 line
*/
- lexer norm 정리
- 허용함수 래핑 완료
- 파서 구현 시작
- 해당 디렉토리 가져오기 함수

define 되어있어서 struct dirent
에서 가져오기 확인해서 사용
- 인터프리터 완성

- 라이너-렉서-인터프리터 최종 동작 확인
- 파서 구현 시작 - 미뤄짐
- 라이너 구현한 내용 코드 리뷰
- 라이너에 맞춰서 렉서 변경
- '' "" $ 해석 및 노드 분리 로직 작성
- 해석 함수 작성 시작
- 렉서 플로우 차트 제작
- 함수 네이밍
- 코드 구현 시작
- 오늘의 할일
- 따옴표, 괄호 안닫혔을 때 어떻게 계속 받도록 할 것인가?
- 따옴표, 괄호로 받는 토큰은 어떤식으로 파서에 던져 주는 것이 좋을까?
- 괄호+개행과 세미콜론의 차이
- 렉서 기능 추가 필요한 것들 a. << >> && || 합치기 b. << 뒤에 WORD의 interpreted_str 값 수정 c. 괄호 문법 오류 <- ) 먼저 나오는거 렉서단에서 우선적으로 오류 출력할 수 있도록 처리 d. 따옴표나 괄호때문에 개행 포함된 친구들 하나의 토큰으로 합치기
- readline에서 개행 문제 -> readline 끝날 때 마다 뉴라인 문자 추가
- add_history 가공 문제 -> lexer 들어가기 전에 완전한 문장(따옴표, 괄호 닫힘)을 만들어서 add_history 및 lexer에 넘김
해석기(따옴표, 달러) 케이스
- 오직 달러 : 개행 혹은 뉴라인 기준 모두 WORD(개행, 뉴라인 삭제)
- 쌍따옴표 : 전체 덩어리를 하나의 WORD로(달러 해석 -> 개행, 뉴라인 유지)
- 따옴표 : 그대로 한 덩어리를 WORD로(해석 X)
- '\', ';' WORD로 받으면 됨
- 렉서 토큰, 구조체 정의
- 파서 트리 구조 정리(연결리스트 + 이진 트리)
- 서브쉘 특이사항 공부
- 렉서 헤더 작성



- 필로 평가 받기(jaesjeon)
- 피어 세션
- 미니쉘 구조 관련 회의
- 허용함수
- 파이프 -> chanhpar님 특강 들음
- 기타 등등 #3
- ‘ “
- Echo
- Cd
- Pwd
- Export
- Unset
- Env
- Exit
- < >
- << >>
- |
- Environment variables
- $?
- Ctr-C ctr-D ctr-\
- —bonus—
- &&, ||
- ( )
- wildcard
HereDoc이 실행되면 이전에 출력해야될 내용을 참다가(ls같은거) 뒤에 HereDoc까지 끝나야 출력을 해줌
(<< "eof" cat > test -e > test2 && echo abc) | ls && echo abc | << "abc" cat > test3 -e
- 깃 파기
- 프롬프트 예제
- 허용 함수 및 쉘 예제 보기
a. 명령어 옵션 체크
b. add_history 예제
c. 파싱 트리 구조 관련 얘기 들음(mypark님)