Парсек
Parsec добре підходить для аналізаторів, що відповідають користувачеві: речі, де у вас є обмежена кількість вводу, але повідомлення про помилки мають значення. Це не дуже швидко, але якщо у вас є невеликі входи, це не має значення. Наприклад, я б обрав Parsec практично для будь-яких інструментів мови програмування, оскільки - в абсолютному вираженні - навіть найбільші вихідні файли не такі великі, але повідомлення про помилки справді мають значення.
Parsec може працювати на різних типах введення, а це означає, що ви можете використовувати його зі стандартним String
або з потоком токенів із якогось зовнішнього лексера. Оскільки він може використовувати String
, він дуже добре обробляє Unicode для вас; вбудовані базові синтаксичні аналізатори люблять digit
і letter
знають Unicode.
Parsec також постачається з монадним трансформатором, що означає, що ви можете скласти його в стек монад. Це може бути корисно, якщо ви хочете відстежувати додатковий стан під час аналізу, наприклад. Ви також можете використати більш триппі-ефекти, такі як недетермінований синтаксичний розбір, або щось інше - звичайну магію монадних трансформаторів.
Атопарсек
Атопарсек набагато швидший за Парсек. Ви повинні використовувати його, коли ви очікуєте отримати великі обсяги введення даних або продуктивність справді має значення. Це чудово для таких речей, як мережевий код (синтаксичний аналіз структури пакетів), синтаксичний аналіз великих обсягів необроблених даних або робота з бінарними форматами файлів.
Attoparsec може працювати з ByteString
s, які є двійковими даними. Це робить його хорошим вибором для реалізації таких речей, як бінарні формати файлів. Однак, оскільки це стосується двійкових даних, він не обробляє такі речі, як кодування тексту; для цього вам слід використовувати модуль attoparsec для Text
.
Attoparsec підтримує поступовий синтаксичний аналіз, а Parsec - ні. Це дуже важливо для певних програм, таких як мережевий код, але для інших не має значення.
Attorparsec має гірші повідомлення про помилки, ніж Parsec, і жертвує деякими функціями високого рівня для підвищення продуктивності. Він спеціалізується на Text
або ByteString
, тому ви не можете використовувати його з маркерами з користувацького лексера. Це також не монадний трансформатор.
Який?
Зрештою, Парсек та Атопарсек обслуговують дуже різні ніші. Різниця на високому рівні - це продуктивність: якщо вона вам потрібна, виберіть Attoparsec; якщо ні, просто йди з Парсеком.
Моя звичайна евристика - це вибір Parsec для мов програмування, форматів файлів конфігурації та введення користувачем, а також майже всього, що я б інакше робив із регулярним виразом. Це речі, які зазвичай виготовляються вручну, тому аналізаторам не потрібно масштабувати, але вони повинні добре повідомляти про помилки.
З іншого боку, я б обрав Attoparsec для таких речей, як реалізація мережевих протоколів, робота з двійковими даними та форматами файлів або читання великих обсягів автоматично генерованих даних. Речі, де ви маєте справу з обмеженнями в часі або великими обсягами даних, які зазвичай не записуються безпосередньо людиною.
Як бачите, насправді вибір часто досить простий: випадки використання не надто перекриваються. Швидше за все, буде цілком зрозуміло, який із них використовувати для будь-якої програми.
attoparsec
швидше, алеparsec
, швидше за все, встановлено за замовчуванням, і тому може бути зручнішим.