簡體   English   中英

haskell中的attoparsec或parsec

[英]attoparsec or parsec in haskell

我必須解析一些文件並將它們轉換為某些預定義的數據類型。

Haskell似乎為此提供了兩個包:

  1. attoparsec
  2. 秒差距

它們之間有什么區別,哪一個更適合根據某些規則解析文本文件?

秒差距

Parsec適用於“面向用戶”的解析器:您有大量輸入但錯誤消息很重要的事情。 它的速度並不快,但如果你輸入的數量很少,那就不重要了。 例如,我會選擇Parsec用於幾乎所有編程語言工具,因為 - 從絕對意義上說 - 即使是最大的源文件也不是那么大但錯誤消息確實很重要。

Parsec可以處理不同的輸入類型,這意味着您可以使用標准String或來自某種外部詞法分析器的標記流。 由於它可以使用String ,因此它可以很好地處理Unicode; 內置的基本解析器(如digitletter具有Unicode感知功能。

Parsec還帶有monad變換器,這意味着你可以將它疊加在monad堆棧中。 例如,如果要在解析期間跟蹤其他狀態,這可能很有用。 你也可以去尋找更多的幻覺效果,比如非確定性的解析,或者其他東西 - 通常是monad變換器的魔力。

Attoparsec

Attoparsec比Parsec快得多。 當您希望獲得大量輸入或性能時,您應該使用它。 它非常適合網絡代碼(解析數據包結構),解析大量原始數據或使用二進制文件格式等。

Attoparsec可以使用ByteString ,它是二進制數據。 這使它成為實現二進制文件格式等的好選擇。 但是,由於這是針對二進制數據的,因此它不處理文本編碼等問題; 為此,您應該將attoparsec模塊用於Text

Attoparsec支持增量解析,而Parsec則不支持。 這對於某些應用程序(如網絡代碼)非常重要,但對其他應用程序無關緊要。

Attorparsec的錯誤消息比Parsec差,並犧牲了一些高級功能來提高性能。 它專門用於TextByteString ,因此您不能將它與自定義詞法分析器中的標記一起使用。 它也不是monad變壓器。

哪一個?

最終,Parsec和Attoparsec迎合了不同的利基。 高級差異是性能:如果需要,請選擇Attoparsec; 如果你不這樣做,那就去Parsec吧。

我通常的啟發式方法是選擇Parsec用於編程語言,配置文件格式和用戶輸入,以及幾乎任何我用regex做的事情。 這些通常是手工生成的,因此解析器不需要擴展,但它們確實需要很好地報告錯誤。

另一方面,我會選擇Attoparsec來實現網絡協議,處理二進制數據和文件格式或讀取大量自動生成的數據。 處理時間限制或大量數據的事情,通常不是由人類直接編寫的。

如您所見,選擇實際上通常非常簡單:用例不會非常重疊。 可能很清楚,哪一個用於任何給定的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM