Skip to content
jaesjeon edited this page Sep 20, 2022 · 72 revisions

2022.09.20

Lexer -> 공백 문자 or 메타캐릭터 기준으로 토큰을 잘라줌

-> 해당 토큰의 token_str 전체를 하나로 받아서

커서를 하나하나 움직이면서 확장이 필요

  1. 상황이 나오면 토큰으로 만들면서 나간다

a. 따옴표에 둘러싸여있으면 무조건 가짜 공백

b. 분리될 가능성이 있는 해석 심볼은 *, $

" a b "

c. 무조건 현재 노드 수정 후 제작 후 이동

c-1. 내 노드가 다음에 올 것과 분리되어야할 토큰이다 -> 빈 새 노드 붙이고 거기로 이동 (ex) " a b "/ a b /

c-2 내 노드가 다음에 올 것과 붙어야할 토큰이다 -> 내 노드에서 그대로 종료 (ex) " a b"/ a b/

  1. 해석이 필요한 모든 부분을 문자열로 붙여서 분리
  • ~
  1. 단독

  2. 뒤에 / 일 때만 해석

4주차(Week 37)

2022.09.07

minsuki2 수정사항

  1. line_handler -> liner
    : 문맥상 통일된다고 생각

  2. liner 소괄호 에러 문제 해결... _cnt_parentheses_flag 함수 제작
    -> (set_parentheses_flag 함수 안 쓰는데 그냥 대체?)

  3. close error 함수 따로 제작

    image
  4. 자세한 close 케이스는 아래 주소에 정리 해놓음
    2022.09.02 - liner close handle

2022.09.04

수정사항 팔로업

맨 첫 노드의 prev에 해당 리스트 마지막 주소 넣기로 합의

해야할 일

  • 리스트 핸들 함수 만들기
  1. t_lx_token *cut_back_node(t_lx_token *cur_node)
  2. t_lx_token *cut_front_node(t_lx_token *cur_node)
  3. t_lx_token *pop_node(t_lx_token *cur_node)
  4. 함수 포인터를 이용한 handle 함수(is_target_token(), apply_action())
    1. is_target_token : AND_IF/OR_IF, PIPE
    2. apply_action : cut_back, pop_node
  • 트리 만들기

&&, ||

PIPE

[CMD -> REDIRECT, SIMPLE_CMD] OR [SUBSHELL -> 위에 작업 순서대로 다시]

3주차(Week 36)

2022.09.03

minsuki2 얘기

  1. _file_to_node 줄 수 + 가독성을 위해 continue 어떰?
  2. lexer 함수 while 끝나고 priv연결 못함 cur이 마지막으로 가있지 않음 ⇒ while문제 token_cur 추가
  3. 괄호가 )으로 닫힌거는 lexer 에러로 판단 하지 않는?
  4. priv 완성 Screen Shot 2022-09-03 at 11 02 54 PM
  5. 그냥 libft 폴더 만들면 안됨?

2022.09.02

dollar tilde 혼합 사용 관련 오류 수정 echo $ -> $

// dollar chunk뒤에 널문자이면 dollar를 그대로 출력해줌

관련해서 코드 수정 후 일관성 있는 동작으로 다시 수정

*chunk 나누는 기준 다시 정리

DOLLAR : interpret_symbol 만나면 그 전까지 잘라서 줌

TILDE : 무조건 자신과 다음 글자만 가져감(무조건 2글자 chunk)

*TILDE translator 체크하는 부분

  1. token_str의 첫 글자가 ~인가
  2. chunk의 다음 글자가 널문자 또는 '/'인가

=> 문제점 : // ... 같은 경우 전부 해석 됨

  1. (추가) interpreted_str이 널인가

// why? TILDE가 여러개의 경우 무조건 2글자씩 잘라서 해석하기 때문에 interpreted_str에는 값이 들어가있을 수 밖에 없음

// 그래서 내 chunk가 token_str의 시작과 같은지 확인할 수 있게 됨

2022.09.01

wildcard 해석 함수 완료 파싱 시작 앞으로 우리가 해야될 일

  1. 연결리스트 양방향으로 만들기

  1. 에러 처리(>, >>, <, <<, (, ), |, &&, ||)
  2. 트리 만들기

&&, ||

PIPE

[CMD -> REDIRECT, SIMPLE_CMD] OR [SUBSHELL -> 위에 작업 순서대로 다시]

  1. pipe, executor 구현

2022.08.31

wildcard 해석 함수 작업 norm 작업

2022.08.30

check lexer issue #5 ~ 해석 대응 작업

  1. 단독 ~, ~로 시작 + 바로 뒷 글자 '/'
  2. 위 케이스가 아닌 ~
  3. $~ 케이스
  4. $[WORD]~ 케이스

2022.08.29

  • wildcard translator 제작 완료

< yasjeon 할일 >

✔️ 재귀 함수 md -> c언어 만들기

✔️ ft_strjoin 만들기

minuski2 할일

✔️ is_matching_file wildcard_flag 만들기

✔️ 파일 하나로 합치기

2022.08.28


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 만들기
  • 파일 하나로 합치기

2주차(Week 35)

2022.08.27

			  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

2022.08.26

/*
             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

*/

2022.08.25 (THU)

  1. lexer norm 정리
  2. 허용함수 래핑 완료
  3. 파서 구현 시작
  4. 해당 디렉토리 가져오기 함수
image

define 되어있어서 struct dirent에서 가져오기 확인해서 사용

2022.08.24 (WEN)

  1. 인터프리터 완성
image
  1. 라이너-렉서-인터프리터 최종 동작 확인
  2. 파서 구현 시작 - 미뤄짐

2022.08.23 (TUE)

  1. 라이너 구현한 내용 코드 리뷰
  2. 라이너에 맞춰서 렉서 변경
  3. '' "" $ 해석 및 노드 분리 로직 작성
  4. 해석 함수 작성 시작

1주차(Week 34)

2022.08.21 (SUN)

  1. 렉서 플로우 차트 제작
  2. 함수 네이밍
  3. 코드 구현 시작
  • 오늘의 할일
  1. 따옴표, 괄호 안닫혔을 때 어떻게 계속 받도록 할 것인가?
  2. 따옴표, 괄호로 받는 토큰은 어떤식으로 파서에 던져 주는 것이 좋을까?
  3. 괄호+개행과 세미콜론의 차이
  4. 렉서 기능 추가 필요한 것들 a. << >> && || 합치기 b. << 뒤에 WORD의 interpreted_str 값 수정 c. 괄호 문법 오류 <- ) 먼저 나오는거 렉서단에서 우선적으로 오류 출력할 수 있도록 처리 d. 따옴표나 괄호때문에 개행 포함된 친구들 하나의 토큰으로 합치기
  5. readline에서 개행 문제 -> readline 끝날 때 마다 뉴라인 문자 추가
  6. add_history 가공 문제 -> lexer 들어가기 전에 완전한 문장(따옴표, 괄호 닫힘)을 만들어서 add_history 및 lexer에 넘김

해석기(따옴표, 달러) 케이스

  1. 오직 달러 : 개행 혹은 뉴라인 기준 모두 WORD(개행, 뉴라인 삭제)
  2. 쌍따옴표 : 전체 덩어리를 하나의 WORD로(달러 해석 -> 개행, 뉴라인 유지)
  3. 따옴표 : 그대로 한 덩어리를 WORD로(해석 X)
  • '\', ';' WORD로 받으면 됨

2022.08.19 (FRI)

  1. 렉서 토큰, 구조체 정의
  2. 파서 트리 구조 정리(연결리스트 + 이진 트리)
  3. 서브쉘 특이사항 공부
  4. 렉서 헤더 작성
image image image

2022.08.17 (WED)

  1. 필로 평가 받기(jaesjeon)
  2. 피어 세션
  3. 미니쉘 구조 관련 회의
  1. 허용함수
    1. 파이프 -> chanhpar님 특강 들음
    2. 기타 등등 #3
  2. ‘ “
  3. Echo
  4. Cd
  5. Pwd
  6. Export
  7. Unset
  8. Env
  9. Exit
  10. < >
  11. << >>
  12. |
  13. Environment variables
  14. $?
  15. Ctr-C ctr-D ctr-\
  16. —bonus—
  17. &&, ||
  18. ( )
  19. wildcard

HereDoc이 실행되면 이전에 출력해야될 내용을 참다가(ls같은거) 뒤에 HereDoc까지 끝나야 출력을 해줌

(<< "eof" cat > test -e > test2 && echo abc) | ls && echo abc | << "abc" cat > test3 -e

2022.08.16 (TUE)

  1. 깃 파기
  2. 프롬프트 예제
  3. 허용 함수 및 쉘 예제 보기

a. 명령어 옵션 체크

b. add_history 예제

c. 파싱 트리 구조 관련 얘기 들음(mypark님)