2013-08-03 24 views
9

Tôi đã đọc rất nhiều về Haskell Parser combinators và thấy rất nhiều chủ đề như:Haskell Parser combinators

Nhưng tất cả các chủ đề này đều so sánh Parser Combinators với Parser Generators.

Tôi muốn hỏi bạn đó của Parser Combinator phù hợp nhất với các điều kiện sau:

  1. Tôi muốn có quyền kiểm soát tốt về các lỗi (bao gồm phục hồi lỗi) và các thông điệp cho người dùng
  2. Tôi muốn để có thể cung cấp cho trình phân tích cú pháp các phần nhỏ của văn bản (không phải toàn bộ tập tin cùng một lúc)
  3. Tôi muốn có thể thiết kế lại ngữ pháp một cách độc đáo (tôi hiện đang phát triển ngữ pháp, vì vậy "waf làm việc tốt" là quan trọng "
  4. Trình phân tích cú pháp cuối cùng phải nhanh (hiệu suất là quan trọng, nhưng không nhiều bằng điểm 1-3).

Tôi đã phát hiện ra, rằng combinators phân tích cú pháp phổ biến nhất là:

+0

Tôi chỉ biết về parsec, một trình phân tích cú pháp đơn thuần. Nó khá dễ sử dụng và bạn có thể kiểm soát tốt các lỗi. – Jocke

+3

Tôi chỉ sử dụng 'attoparsec' vì vậy tôi không biết tay đầu tiên về Parsec. attoparsec có danh tiếng là cực kỳ nhanh nhưng không quá tuyệt vời trên các thông báo lỗi phía trước. Nó được nhắm mục tiêu ở phân tích cú pháp cuối cùng cần một người dùng đầu cuối không bao giờ thấy thông báo lỗi từ đó. – asm

+0

@AndrewMyers, tôi đồng ý, tôi đã sử dụng attoparsec cho loại điều đó và nó rất nhanh và đơn giản (đặc biệt là cho các ngữ pháp đơn giản-ish). Nó không có nhiều chức năng ưa thích như thư viện parsec bình thường trên hackage nhưng nó hỗ trợ 'Text' rất tuyệt vời. – Wes

Trả lời

3

Tôi có thể nói chắc chắn đi với Parsec, heres lý do:

Attoparsec được thiết kế để nhanh chóng sử dụng, nhưng thiếu sự hỗ trợ mạnh mẽ cho các thông báo lỗi bạn nhận được trong Parsec, vì vậy đó là một chiến thắng cho điểm đầu tiên của bạn.

Kinh nghiệm sử dụng thư viện trình phối hợp phân tích cú pháp của tôi là thực sự dễ dàng kiểm tra các phần riêng lẻ của trình phân tích cú pháp, hoặc trong GHCi hoặc trong kiểm tra, vì vậy điểm thứ hai là tất cả chúng đều hài lòng. Cuối cùng, Attoparsec và Parsec khá nhanh.

Cuối cùng, Parsec đã tồn tại lâu nhất và có nhiều tính năng hữu ích và nâng cao. Điều này có nghĩa là khả năng bảo trì chung sẽ dễ dàng hơn, nhiều ví dụ hơn trong Parsec và nhiều người đã quen thuộc hơn với nó. uu-parsinglib chắc chắn đáng để bạn khám phá, nhưng tôi khuyên bạn nên làm quen với Parsec trước tiên là khóa học tốt hơn vì những lý do này. (Alex cũng là lexer được đề nghị nhiều nhất để sử dụng với Parsec hoặc cách khác, nhưng tôi không tự mình sử dụng nó.)

+0

Điểm tốt. Tôi đã xóa một nửa cuộc trò chuyện của mình. Thông điệp này sẽ tự hủy trong năm giây, cho hay mất một ngày. – AndrewC