Разработчик ParseKit здесь.
(В моем ответе следует помнить одну вещь: хотя я являюсь разработчиком ParseKit, на самом деле я не проектировал фреймворк или его API. Он основан в основном на конкретных проектах, найденных в книге Стивена Мецкера Создание анализаторов с помощью Java. Я просто перенес их на ObjC/Cocoa.)
ParseKit состоит из трех частей:
- Очень гибкий и высокопроизводительный Tokenizer Objective-C (классы
PKTokenizer
, PKToken
)
- Полноценный динамический набор инструментов Objective-C Parser для создания рекурсивно-приемлемых синтаксических анализаторов с обратным отслеживанием и бесконечным просмотром вперед (класс
PKParser
и подклассы). Из-за своей динамичности производительность этого инструментария синтаксического анализатора невелика при больших объемах ввода.
- Генерация синтаксического анализатора 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 подходит для анализа относительно небольших входных строк. Вот некоторые примеры:
- Языки запросов в стиле XPath
- SQL
- Относительно компактный DSL или командные языки
- Регулярные выражения
- Меню (или то, что можно разбить на плоский массив относительно небольших предложений)
Инструментарий синтаксического анализатора ParseKit обычно не подходит для анализа больших входных строк из-за проблем с производительностью. Вот некоторые примеры:
- XML-документы
- JSON-документы
ParseKit, безусловно, может (и делает) анализировать эти типы входных данных, но опять же, производительность низкая по сравнению с выделенным парсером XML или JSON из-за динамизма ParseKit (откат, бесконечный поиск вперед).
Для "винного меню" я бы сказал да - ParseKit, вероятно, является хорошим (возможно, отличным) решением. Особенно, если вы можете разбить отдельные строки ввода на массив строк и анализировать их одну за другой. Производительность должна быть достаточно хорошей, и как только вы преодолеете кривую обучения, ParseKit станет невероятно мощным/удобным для таких видов работ.
На самом деле, IIRC, оригинальная книга Мецкера даже использует что-то подобное в качестве примера хорошего использования его инструментария.
Надеюсь это поможет.
person
Todd Ditchendorf
schedule
18.04.2012