Парсекит или разбирать самостоятельно?

Я пишу приложение, в котором мне нужно разобрать винное меню. Из того, что я видел до сих пор, все они следуют некоторой структуре, трюк будет заключаться в определении всех этих структур. Сейчас я изучаю использование Parsekit и создание грамматик, но кривая обучения довольно крутая. Вместо того, чтобы потратить следующие пару недель на выяснение этого, а затем понять, что это неправильный подход, я решил спросить.

Любые идеи/ресурсы, которыми люди хотели бы поделиться при разборе таких вещей? Спасибо, Оливье


person otusweb    schedule 18.04.2012    source источник


Ответы (1)


Разработчик ParseKit здесь.

(В моем ответе следует помнить одну вещь: хотя я являюсь разработчиком ParseKit, на самом деле я не проектировал фреймворк или его API. Он основан в основном на конкретных проектах, найденных в книге Стивена Мецкера Создание анализаторов с помощью Java. Я просто перенес их на ObjC/Cocoa.)


ParseKit состоит из трех частей:

  1. Очень гибкий и высокопроизводительный Tokenizer Objective-C (классы PKTokenizer, PKToken)
  2. Полноценный динамический набор инструментов Objective-C Parser для создания рекурсивно-приемлемых синтаксических анализаторов с обратным отслеживанием и бесконечным просмотром вперед (класс PKParser и подклассы). Из-за своей динамичности производительность этого инструментария синтаксического анализатора невелика при больших объемах ввода.
  3. Генерация синтаксического анализатора Objective-C с помощью грамматик. Создайте синтаксический анализатор Objective-C для своего пользовательского языка, используя синтаксис грамматики в стиле BNF (похожий на yacc или ANTLR). Во время синтаксического анализа синтаксический анализатор будет предоставлять обратные вызовы вашему коду Objective-C. Из-за динамизма № 2 писать грамматики относительно легко, и существует относительно мало ограничений на то, что вы можете делать с грамматиками.

Каждый компонент выше основывается на предыдущих компонентах. Итак, № 3 — инструментарий грамматики — использует как № 1 токенизатор, так и № 2 набор инструментов парсера.

Если вы выполняете серьезные задачи по синтаксическому анализу, я всегда рекомендую проверить #1 — токенизатор — PKTokenizer. Он невероятно гибкий и мощный, а производительность очень хорошая. Если вам проще работать с токенами, а не с входной строкой (как обычно и бывает), вы, вероятно, захотите проверить это.

Что касается № 2 (инструментарий ObjC Parser), вы обычно захотите просто пропустить его и перейти к № 3, поскольку создавать парсеры с помощью грамматики намного приятнее, чем создавать их с помощью кода ObjC.

Для # 3 (инструментарий ObjC Parser через BNF Grammars) наиболее важным соображением является производительность. Инструментарий синтаксического анализатора ParseKit подходит для анализа относительно небольших входных строк. Вот некоторые примеры:

  1. Языки запросов в стиле XPath
  2. SQL
  3. Относительно компактный DSL или командные языки
  4. Регулярные выражения
  5. Меню (или то, что можно разбить на плоский массив относительно небольших предложений)

Инструментарий синтаксического анализатора ParseKit обычно не подходит для анализа больших входных строк из-за проблем с производительностью. Вот некоторые примеры:

  1. XML-документы
  2. JSON-документы

ParseKit, безусловно, может (и делает) анализировать эти типы входных данных, но опять же, производительность низкая по сравнению с выделенным парсером XML или JSON из-за динамизма ParseKit (откат, бесконечный поиск вперед).


Для "винного меню" я бы сказал да - ParseKit, вероятно, является хорошим (возможно, отличным) решением. Особенно, если вы можете разбить отдельные строки ввода на массив строк и анализировать их одну за другой. Производительность должна быть достаточно хорошей, и как только вы преодолеете кривую обучения, ParseKit станет невероятно мощным/удобным для таких видов работ.

На самом деле, IIRC, оригинальная книга Мецкера даже использует что-то подобное в качестве примера хорошего использования его инструментария.

Надеюсь это поможет.

person Todd Ditchendorf    schedule 18.04.2012