minishell은 이름 그대로 나만의 작은 shell을 만드는 과제이다. bash를 기반으로 하여 shell을 만든다. 이 과제를 통해서 쉘의 동작 방식을 알아보고 구현할 수 있게 된다.
minishell을 처음 시작할 때, 파싱 과정을 어떻게 할지에 대한 고민이 있었다. 이전의 ft_printf를 해결한 것처럼 앞에서부터 입력을 하나씩 읽고 코드를 리스트 형식으로 만드는 방법을 생각했다. 그러나, redirection이나 pipe, heredoc을 처리하는 데 일반적인 리스트는 복잡하다고 생각했다. 그래서 다른 방법을 찾아보았다.
push_swap을 풀 때 많은 사람들이 문제 해결을 위해 quick sort을 사용했던 것으로 기억한다. minishell도 마찬가지로 많은 사람들이 사용하는 방법이 존재한다. 그것이 바로 AST(abstract syntax tree)이다.
우리는 컴파일러가 코드를 해석하는 과정 중 일부를 minishell에 응용할 것이다.
컴파일러는 코드를 받았을 때, 어휘 분석 -> 구문 분석 -> 의미 분석 ... 등의 과정을 거쳐 코드를 해석하고 실행한다. 여기서 AST는 구문 분석 과정에서 사용되는 트리이다.
위의 세 단계를 모두 거쳤다면, 코드가 AST 형태로 변환되었을 것이다. 이제 우리는 AST를 가지고 코드를 실행시키면 된다. 코드 실행 과정은 파싱 과정에 비해서 상대적으로 쉬워서 다루지 않겠다.
나도 AST 구조를 짤 때는 정말 힘들었지만, 이후 실행 과정이나 평가 받을 때 내용을 설명하는 과정에서 많은 이익을 본 것 같다.
우리 팀의 minishell의 flowchart이다. 세부적인 내용은 제외하고 전체적인 흐름을 나타냈다.