haskell의 attoparsec 또는 parsec
일부 파일을 구문 분석하고 미리 정의 된 데이터 유형으로 변환해야합니다.
Haskell은이를 위해 두 가지 패키지를 제공하는 것 같습니다.
둘의 차이점은 무엇이며 일부 규칙에 따라 텍스트 파일을 구문 분석하는 데 더 적합한 것은 무엇입니까?
파섹
Parsec은 "사용자 대면"파서에 적합합니다. 제한된 양의 입력이 있지만 오류 메시지가 중요한 경우입니다. 그렇게 빠르지는 않지만 작은 입력이 있다면 중요하지 않습니다. 예를 들어, 거의 모든 프로그래밍 언어 도구에 대해 Parsec을 선택합니다. 절대적으로 가장 큰 소스 파일도 그렇게 크지는 않지만 오류 메시지가 정말 중요하기 때문입니다.
Parsec은 다양한 입력 유형에서 작동 할 수 있습니다. 즉, 표준 String
또는 일종의 외부 어휘 분석기의 토큰 스트림과 함께 사용할 수 있습니다 . 를 사용할 수 있기 때문에 String
유니 코드를 완벽하게 처리합니다. 등 기본적인 파서 내장 digit
및 letter
유니 코드 알고 있습니다.
Parsec은 또한 모나드 변환기와 함께 제공되므로 모나드 스택에 계층화 할 수 있습니다. 예를 들어 구문 분석 중에 추가 상태를 추적하려는 경우 유용 할 수 있습니다. 비 결정적 파싱이나 모나드 변환기의 일반적인 마법과 같은 더 많은 삼중 효과를 얻을 수도 있습니다.
아토 파섹
Attoparsec은 Parsec보다 훨씬 빠릅니다. 많은 양의 입력 또는 성능이 정말로 중요 할 것으로 예상 할 때 사용해야합니다. 네트워킹 코드 (패킷 구조 구문 분석), 대량의 원시 데이터 구문 분석 또는 이진 파일 형식 작업과 같은 작업에 적합합니다.
Attoparsec ByteString
은 이진 데이터 인 s 와 함께 사용할 수 있습니다 . 이것은 바이너리 파일 형식과 같은 것을 구현하는 데 좋은 선택입니다. 그러나 이것은 이진 데이터 용이므로 텍스트 인코딩과 같은 것을 처리하지 않습니다. 이를 위해 attoparsec 모듈을 Text
.
Attoparsec은 Parsec이 지원하지 않는 증분 구문 분석을 지원합니다. 이것은 네트워킹 코드와 같은 특정 응용 프로그램에 매우 중요하지만 다른 응용 프로그램에는 중요하지 않습니다.
Attorparsec은 Parsec보다 오류 메시지가 더 나쁘고 성능을 위해 일부 고급 기능을 희생합니다. Text
또는에 특화되어 ByteString
있으므로 사용자 지정 렉서의 토큰과 함께 사용할 수 없습니다. 또한 모나드 변환기가 아닙니다.
어느 것?
궁극적으로 Parsec과 Attoparsec은 매우 다른 틈새 시장을 제공합니다. 높은 수준의 차이점은 성능입니다. 필요한 경우 Attoparsec을 선택하십시오. 그렇지 않은 경우 Parsec을 사용하십시오.
저의 일반적인 휴리스틱은 프로그래밍 언어, 구성 파일 형식 및 사용자 입력뿐만 아니라 정규식으로 수행 할 거의 모든 작업을 위해 Parsec을 선택하는 것입니다. 이들은 일반적으로 수작업으로 생성되므로 파서는 확장 할 필요가 없지만 오류를 잘보고해야합니다.
반면에 네트워크 프로토콜 구현, 이진 데이터 및 파일 형식 처리 또는 자동 생성 된 대량의 데이터 읽기와 같은 작업에는 Attoparsec을 선택합니다. 일반적으로 사람이 직접 작성하지 않는 시간 제약이나 대량의 데이터를 처리하는 경우.
보시다시피 선택은 실제로 매우 간단합니다. 사용 사례는 많이 겹치지 않습니다. 주어진 응용 프로그램에 대해 어떤 것을 사용할지 매우 분명합니다.
참고 URL : https://stackoverflow.com/questions/19208231/attoparsec-or-parsec-in-haskell
'Development Tip' 카테고리의 다른 글
내 포함 가드가 재귀 적 포함 및 다중 기호 정의를 방지하지 않는 이유는 무엇입니까? (0) | 2020.11.04 |
---|---|
angularjs에서 제출시 유효성 검사 오류 메시지 표시 (0) | 2020.11.04 |
명시 적 유형 매개 변수를 사용하여 템플릿 멤버 함수를 호출하려고하면 오류가 발생하는 이유는 무엇입니까? (0) | 2020.11.04 |
setBackgroundResource ()는 내 XML 레이아웃 속성을 버립니다. (0) | 2020.11.04 |
jQuery는 AJAX 스트림을 점진적으로 읽습니까? (0) | 2020.11.04 |