[minishell] 과제 정리

SonHero·2022년 5월 21일
0

42cursus

목록 보기
2/5
post-thumbnail

- minishell 과제를 마치고 내용을 정리하는 문서

minishell은 이름 그대로 나만의 작은 shell을 만드는 과제이다. bash를 기반으로 하여 shell을 만든다. 이 과제를 통해서 쉘의 동작 방식을 알아보고 구현할 수 있게 된다.

문제 해결을 위한 아이디어

minishell을 처음 시작할 때, 파싱 과정을 어떻게 할지에 대한 고민이 있었다. 이전의 ft_printf를 해결한 것처럼 앞에서부터 입력을 하나씩 읽고 코드를 리스트 형식으로 만드는 방법을 생각했다. 그러나, redirection이나 pipe, heredoc을 처리하는 데 일반적인 리스트는 복잡하다고 생각했다. 그래서 다른 방법을 찾아보았다.
push_swap을 풀 때 많은 사람들이 문제 해결을 위해 quick sort을 사용했던 것으로 기억한다. minishell도 마찬가지로 많은 사람들이 사용하는 방법이 존재한다. 그것이 바로 AST(abstract syntax tree)이다.

우리는 컴파일러가 코드를 해석하는 과정 중 일부를 minishell에 응용할 것이다.
컴파일러는 코드를 받았을 때, 어휘 분석 -> 구문 분석 -> 의미 분석 ... 등의 과정을 거쳐 코드를 해석하고 실행한다. 여기서 AST는 구문 분석 과정에서 사용되는 트리이다.

  • 어휘 분석
    코드를 토큰화하여 여러 개의 토큰으로 나눈다. (토큰에는 해당 토큰의 종류와, 내용을 담고 있어야 한다)
  • 구문 분석
    토큰들을 가지고 AST를 만든다. (이 과정에서 나는 BNF, 재귀적 하강 파싱을 사용했다)
  • 어휘 분석
    AST를 순회하면서 현재 코드가 올바른 문법인지 검사한다. (나는 재귀적 하강 검사를 사용했다)

위의 세 단계를 모두 거쳤다면, 코드가 AST 형태로 변환되었을 것이다. 이제 우리는 AST를 가지고 코드를 실행시키면 된다. 코드 실행 과정은 파싱 과정에 비해서 상대적으로 쉬워서 다루지 않겠다.

AST를 사용했을 때 장단점

  • 장점 : 코드가 깔끔해진다. 설명할 때 편하다. 실행 과정에서 편하다.
  • 단점 : AST 구조를 짜는 것이나 재귀를 사용한 파싱 과정이 어렵다.

나도 AST 구조를 짤 때는 정말 힘들었지만, 이후 실행 과정이나 평가 받을 때 내용을 설명하는 과정에서 많은 이익을 본 것 같다.


우리 팀의 minishell의 flowchart이다. 세부적인 내용은 제외하고 전체적인 흐름을 나타냈다.

profile
개발하는 학생입니다.

0개의 댓글