атопарсек або парсек у хаскелі


76

Мені потрібно проаналізувати деякі файли та перетворити їх на деякі визначені типи даних.

Здається, Haskell пропонує два пакети для цього:

  1. атопарсек
  2. парсек

У чому різниця між ними двома і яким із них краще підходить для синтаксичного аналізу текстового файлу за деякими правилами?


Вони приблизно еквівалентні. attoparsecшвидше, але parsec, швидше за все, встановлено за замовчуванням, і тому може бути зручнішим.
sanityinc

1
Документація для модуля Data.Attoparsec.ByteString містить порівняння між Parsec та Attoparsec: hackage.haskell.org/package/attoparsec-0.10.4.0/docs/…
danidiaz

6
Я хотів би лише зазначити, що Haskell надає набагато більше двох пакетів для синтаксичного аналізу, і вам бракує декількох дуже хороших, зокрема uu-parsinglibі polyparse.
John L

@JohnL Дякую, не знав цього.
Сібі

1
Зараз також існує мегапарсек парсек-форк: mail.haskell.org/pipermail/haskell-cafe/2015-September/…
unhammer

Відповіді:


140

Парсек

Parsec добре підходить для аналізаторів, що відповідають користувачеві: речі, де у вас є обмежена кількість вводу, але повідомлення про помилки мають значення. Це не дуже швидко, але якщо у вас є невеликі входи, це не має значення. Наприклад, я б обрав Parsec практично для будь-яких інструментів мови програмування, оскільки - в абсолютному вираженні - навіть найбільші вихідні файли не такі великі, але повідомлення про помилки справді мають значення.

Parsec може працювати на різних типах введення, а це означає, що ви можете використовувати його зі стандартним Stringабо з потоком токенів із якогось зовнішнього лексера. Оскільки він може використовувати String, він дуже добре обробляє Unicode для вас; вбудовані базові синтаксичні аналізатори люблять digitі letterзнають Unicode.

Parsec також постачається з монадним трансформатором, що означає, що ви можете скласти його в стек монад. Це може бути корисно, якщо ви хочете відстежувати додатковий стан під час аналізу, наприклад. Ви також можете використати більш триппі-ефекти, такі як недетермінований синтаксичний розбір, або щось інше - звичайну магію монадних трансформаторів.

Атопарсек

Атопарсек набагато швидший за Парсек. Ви повинні використовувати його, коли ви очікуєте отримати великі обсяги введення даних або продуктивність справді має значення. Це чудово для таких речей, як мережевий код (синтаксичний аналіз структури пакетів), синтаксичний аналіз великих обсягів необроблених даних або робота з бінарними форматами файлів.

Attoparsec може працювати з ByteStrings, які є двійковими даними. Це робить його хорошим вибором для реалізації таких речей, як бінарні формати файлів. Однак, оскільки це стосується двійкових даних, він не обробляє такі речі, як кодування тексту; для цього вам слід використовувати модуль attoparsec для Text.

Attoparsec підтримує поступовий синтаксичний аналіз, а Parsec - ні. Це дуже важливо для певних програм, таких як мережевий код, але для інших не має значення.

Attorparsec має гірші повідомлення про помилки, ніж Parsec, і жертвує деякими функціями високого рівня для підвищення продуктивності. Він спеціалізується на Textабо ByteString, тому ви не можете використовувати його з маркерами з користувацького лексера. Це також не монадний трансформатор.

Який?

Зрештою, Парсек та Атопарсек обслуговують дуже різні ніші. Різниця на високому рівні - це продуктивність: якщо вона вам потрібна, виберіть Attoparsec; якщо ні, просто йди з Парсеком.

Моя звичайна евристика - це вибір Parsec для мов програмування, форматів файлів конфігурації та введення користувачем, а також майже всього, що я б інакше робив із регулярним виразом. Це речі, які зазвичай виготовляються вручну, тому аналізаторам не потрібно масштабувати, але вони повинні добре повідомляти про помилки.

З іншого боку, я б обрав Attoparsec для таких речей, як реалізація мережевих протоколів, робота з двійковими даними та форматами файлів або читання великих обсягів автоматично генерованих даних. Речі, де ви маєте справу з обмеженнями в часі або великими обсягами даних, які зазвичай не записуються безпосередньо людиною.

Як бачите, насправді вибір часто досить простий: випадки використання не надто перекриваються. Швидше за все, буде цілком зрозуміло, який із них використовувати для будь-якої програми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.