Cabal 파서, 주석 보존으로 **정확한 파싱**을 구현하다!
by DD
5개월 전
조회수 16
Cabal은 Haskell의 패키지 관리 시스템으로, 기존 파서는 주석과 공백을 손실하는 문제가 있었음.
정확한 파싱을 위해 파서 구조를 변경, 주석 정보를 보존하여 원본 파일과 동일한 출력을 보장함.
개발자들은 Cabal 파일 자동 수정 및 의존성 관리 개선에 대한 기대감을 표하며, 향후 기능 확장에 주목함.
주석 보존을 위한 파서 구조 변경
기존 Cabal 파서는 렉서(lexer)에서 주석을 삭제하여 정보 손실이 발생했다. 구체적으로, Alex를 사용하여 렉서를 구현하고, Field ann 데이터 타입을 변경하여 주석 정보를 저장했다. 따라서, WithComments ann 타입을 도입하여 주석을 보존하고, 정확한 파싱을 위한 기반을 마련했다.
Functor의 함정과 해결책
Field ann은 Functor 인스턴스를 가지므로, fmap을 사용하여 주석을 추가할 때 문제가 발생할 수 있다. 반면, FieldLine ann과 Field ann에서 동일한 주석이 첨부되는 부작용이 발생한다. 따라서, 데이터 타입의 인스턴스에 대한 명확한 이해가 필요하며, GenericPackageDescription을 래핑하여 Eq extensionality를 보존했다.
정확한 파싱 구현을 위한 향후 과제
현재 주석 보존은 완료되었지만, 정확한 파싱을 위해서는 추가 작업이 필요하다. 구체적으로, common stanzas의 병합을 방지하고, field grammar parser에서 trivia를 유지해야 한다. 결과적으로, 의존성 범위의 공백을 유지하는 등, Cabal 파일의 완전한 정확성을 확보하기 위한 노력이 진행 중이다.