2012-09-18 2 views
6

하스켈을 배우고 (자신을 고문하는) 연습으로, 구성 가능한 하스켈 코드 미화 작성을 고려 중입니다.하스켈 파서 AST

그것은 구성 JSON 또는 YAML에 기록 된 파일 (또는 더 나은 무엇인가?) dataclass 문, 섹션 사이의 라인 수 등 내가

을 수입 정렬 정렬/그룹화와 같은 선택을 지정 지원

Abstract 문법 트리 (AST) 을 생성하고 코멘트을 유지하는 Haskell 98을위한 파서를 찾고있다. 언어 확장이있는 GHC를 구문 분석하면 보너스가됩니다.

그런 것이 없다면 재귀 적 파서 또는 Parsec 또는 파서 생성기를 사용하여 작성할 수 있다고 생각합니다. 어쩌면 내 자신을 굴리는 것은 학습을 증가시킬 것이다 (그리고 고문 :-)).

오픈 소스 라이센스 중 하나에서 사용 가능한 완전한 Haskell-> AST 파서가 있습니까? 이 프로젝트에서 어떤 진전이 있었다면 나는 그것을 github에 올릴 것이다.

+0

내 애완 동물 오줌 중 하나는 추한 코드입니다. 대부분의 작업은 Java로 이루어졌으며 사람들이 중괄호 정렬을하지 않고 코드를 체크인 할 수있는 방법, 연산자 주위의 간격이 일정하지 않은지 등은 나를 놀라게합니다. 코드를 읽지 않습니까? 그것들을 괴롭히지 않니? 어쩌면 그게 내 OCD. 어쨌든, 나에게서 나왔다 하스켈은 진도가 더 좋게 보입니다. 그러나 나는 아직도 미화를 쓰고 싶다 :-). – Ralph

+0

예. 나는 농담을하고있었습니다. 왜냐하면 당신이 제안하는 것과 같은 것들을 좋아하기 때문입니다. config 파일의 언어로 haskell을 사용하지 않는 이유는 무엇입니까? 내가 누군가가 점차적으로 자신의 도메인 특정 언어를 진화 시켜서 그들이 단지 haskell을 원할 때까지 읽을 것이라고 확신하지만 [this] (http://www.jmreardon.com/posts/2011-07-17-typesafe-config -in-haskell.html)은 내가 찾을 수있는 가장 가까운 곳입니다. 또는 [ConfigFile] (http://hackage.haskell.org/package/ConfigFile) 패키지를 사용할 수 있습니다. – AndrewC

답변

16

haskell-src-exts 패키지에는 파서가 있습니다. 파서는 대부분의 GHC 확장을 파싱 할뿐만 아니라, 또한 구문 XML 리터럴과 같은 일반적인 확장을 인식합니다. 주석 정보에 액세스하려면 parseModuleWithComments 함수를 사용해야합니다.

그러나 주석은 실제 구문 트리에 저장되지 않습니다. 그들은 위치 정보와 함께 별도의 주석 목록으로 저장됩니다. 선형 통합 알고리즘을 사용하여 트리를 목록과 병합하여 실제로 트리에 주석을 포함해야하는 경우 트리에 주석을 포함하는 것이 중요합니다 (두 시퀀스는 모두 "정렬"로 간주 할 수 있음). "annotated"AST는 각 노드에 임의의 메타 데이터 (기본값 : SrcSpanInfo)를 포함 할 수 있기 때문에 주석을 관련 AST 노드와 함께 저장할 수도 있습니다. 실제 haskell-src-exts 패키지에서 이것이 수행되지 않은 이유는 AST 파서가 주석 파서 앞에 작성 되었기 때문일 수 있습니다.

2

나는 하스켈 코드를 자동 포맷하는 아주 간단한 도구를 작성했다. haskell-src-exts의 파싱 및 예쁜 인쇄 기능을 사용합니다. https://github.com/djv/small/blob/master/tidy.hs에서 찾을 수 있습니다. 좀 더 유연하고 강력한 것을위한 시작일 수 있습니다.