2024-10-20
bison 없이 flex 만 사용하기
https://github.com/vimkim/flex-without-bison
오늘은 bison 없이 flex만으로 토크나이저를 만들어 사용하는 방법을 학습했다.
볼 수 있는 대부분의 학습 자료들은 모두 flex와 bison을 동시에 사용하기 때문에, 그 중간에 있는 레이어에 대한 나의 이해가 부족하게 느껴졌다.
중간 단계에서 어떤 과정이 일어나는지에 대한 명확한 이해가 없으니 제대로 사용하는 방법을 모르는 느낌이 들었다.
따라서 bison 없이 오로지 flex만을 사용하고, flex가 생성한 lex.yy.c를 사용하는 간단한 c 프로그램을 만들어서 구조와 원리를 이해하려고 노력했다.
flex -d -Cf -b --reentrant $(FLEX_FILE)
덕분에 flex에 부여할 수 있는 다양한 옵션에 대해 알게 되었다.
gdb를 통해서 YY_INPUT 등 다양한 flex 매크로와 함수가 어떻게 동작하는지 감을 잡고자 했다.
아쉬운 점은 gdb가 macro가 순차적으로 어떻게 실행되는지 보여주지 않고 바로 next로 넘어가 버리기 때문에 조금 불편하다는 점이 있다.
디버거를 사용할 때, -g, -ggdb 옵션과 -g3 옵션이 서로 어떻게 다른지도 자세히 알아보고 싶다.
계속 업데이트 해볼 예정이다.
nest-cli new vs. git clone typescript-starter
flex를 보다가 갑자기 nest가 나와서 뜬금 없지만, 예전에 하던 프로젝트가 문득 생각나서 갑작스레 다시 한번 살펴보게 되었다.
nest new와 nest typescript-starter의 차이점에 대해 궁금했다.
공식 문서에는 분명 둘 다 동일한 역할을 한다고 적혀있었으나, 실제 행동은 다르다.
예를 들어, nest new로 생성한 프로젝트는 eslint ‘^9.0.0’ 버전이 package.json에 적혀 있었고,
git clone https://github.com/nestjs/typescript-starter.git project-name
위 명령어를 통해 생성한 프로젝트는 eslint 8이 package.json에 명시되어 있었고, 오류 없이 동작했다.
nest new에서 eslint를 돌렸을 때는 한창 breaking change의 문제인 flat config 등등 때문에 제대로 동작을 하지 않았다. 과도기에 있는 업데이트가 아직 unstable한 것 같았다.
그렇다고 typescript-starter가 업데이트가 느린 것도 아니었다. 분명 3일 전에 업데이트가 되었고, 많은 버그들이 수정되어 있었다.
현업에서는 조금 더 stable한 git clone을 분명 선호할 것 같았다.
시간이 나면 둘을 다운 받아서 어떤 점이 다른지 명확히 비교를 해보려고 한다.
이에 대한 자세한 분석을 해볼 예정이다.