![](/img/trans.png)
[英]Non-greedy match between two strings using parsec or attoparsec in Haskell
[英]attoparsec or parsec in haskell
Parsec適用於“面向用戶”的解析器:您有大量輸入但錯誤消息很重要的事情。 它的速度並不快,但如果你輸入的數量很少,那就不重要了。 例如,我會選擇Parsec用於幾乎所有編程語言工具,因為 - 從絕對意義上說 - 即使是最大的源文件也不是那么大但錯誤消息確實很重要。
Parsec可以處理不同的輸入類型,這意味着您可以使用標准String
或來自某種外部詞法分析器的標記流。 由於它可以使用String
,因此它可以很好地處理Unicode; 內置的基本解析器(如digit
和letter
具有Unicode感知功能。
Parsec還帶有monad變換器,這意味着你可以將它疊加在monad堆棧中。 例如,如果要在解析期間跟蹤其他狀態,這可能很有用。 你也可以去尋找更多的幻覺效果,比如非確定性的解析,或者其他東西 - 通常是monad變換器的魔力。
Attoparsec比Parsec快得多。 當您希望獲得大量輸入或性能時,您應該使用它。 它非常適合網絡代碼(解析數據包結構),解析大量原始數據或使用二進制文件格式等。
Attoparsec可以使用ByteString
,它是二進制數據。 這使它成為實現二進制文件格式等的好選擇。 但是,由於這是針對二進制數據的,因此它不處理文本編碼等問題; 為此,您應該將attoparsec模塊用於Text
。
Attoparsec支持增量解析,而Parsec則不支持。 這對於某些應用程序(如網絡代碼)非常重要,但對其他應用程序無關緊要。
Attorparsec的錯誤消息比Parsec差,並犧牲了一些高級功能來提高性能。 它專門用於Text
或ByteString
,因此您不能將它與自定義詞法分析器中的標記一起使用。 它也不是monad變壓器。
最終,Parsec和Attoparsec迎合了不同的利基。 高級差異是性能:如果需要,請選擇Attoparsec; 如果你不這樣做,那就去Parsec吧。
我通常的啟發式方法是選擇Parsec用於編程語言,配置文件格式和用戶輸入,以及幾乎任何我用regex做的事情。 這些通常是手工生成的,因此解析器不需要擴展,但它們確實需要很好地報告錯誤。
另一方面,我會選擇Attoparsec來實現網絡協議,處理二進制數據和文件格式或讀取大量自動生成的數據。 處理時間限制或大量數據的事情,通常不是由人類直接編寫的。
如您所見,選擇實際上通常非常簡單:用例不會非常重疊。 可能很清楚,哪一個用於任何給定的應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.