Пытаюсь написать простенький парсер YAML, читал спецификацию с yaml.org, перед тем, как начать, мне было интересно, лучше ли написать парсер, накрученный вручную, или использовать lex
(flex/bison
). Я посмотрел на libyaml
(библиотека C) - похоже, не использует lex/yacc
. YAML (исключая стили потока) кажется более линейно-ориентированным, поэтому проще написать синтаксический анализатор вручную или использовать flex/bison
Спасибо.
Парсинг YAML - lex или ручная работа?
Ответы (1)
Этот ответ, по сути, является ответом на вопрос: должен ли я создавать собственный синтаксический анализатор или использовать генератор синтаксических анализаторов? и не имеет ничего общего с YAML. Но тем не менее он ответит на ваш вопрос.
Вопрос, который вам нужно задать, заключается не в том, работает ли это с данным языком/грамматикой, а в том, чувствую ли я уверенность в реализации этого. Правда в том, что большинство форматов, которые вы хотите анализировать, будут работать только со сгенерированным парсером. Другая истина заключается в том, что можно анализировать даже сложные языки с помощью простого написанного от руки парсера рекурсивного спуска.
Среди прочего, я написал анализатор рекурсивного спуска для EDDL (C и структурированные элементы) и парсер bison/flex для INI. Я выбрал эти примеры, потому что они идут вразрез с интуицией, а внешние требования продиктовали решение.
Поскольку я установил на техническом уровне, что это возможно, почему вы предпочли бы одно другому? На этот вопрос действительно сложно ответить, вот несколько мыслей по этому поводу:
- Написать хороший лексер действительно сложно. В большинстве случаев имеет смысл использовать flex для генерации лексера. Нет особого смысла вручную создавать собственный лексер, если только у вас нет действительно экзотических входных форматов.
- Использование bison или подобных генераторов делает грамматику, используемую для синтаксического анализа, явно видимой. Основное преимущество здесь в том, что разработчик, обслуживающий ваш парсер, через пять лет сразу увидит используемую грамматику и сможет сравнить ее с любыми спецификациями.
- Использование парсера с рекурсивным спуском делает совершенно понятным, что происходит в парсере. Это обеспечивает простые средства для изящного разрешения конфликтов Гарри. Вы можете написать простое if вместо перестановки всей грамматики в LALR1.
- При разработке парсера вы можете замазать детали написанным от руки парсером, с помощью bison это практически невозможно. В бизоне грамматика должна работать, иначе генератор ничего не сделает.
- Bison великолепно указывает на формальные ошибки в грамматике. К сожалению, вы остались один, чтобы исправить их. При ручной сборке синтаксического анализатора вы обнаружите недостатки только тогда, когда синтаксический анализатор читает чепуху.
Это не однозначный ответ ни для того, ни для другого, но он указывает вам правильное направление. Поскольку кажется, что вы пишете синтаксический анализатор для развлечения, я думаю, вам следует написать оба типа синтаксических анализаторов.
lex
иflex
являются генераторами сканеров, а не генераторами парсеров; чтобы выполнить синтаксический анализ, вы хотели бы использоватьyacc
илиbison
. - person templatetypedef   schedule 20.09.2011lex
— это просто токенизатор. Я хотел знать, подходит ли структура YAMLflex/bison
или синтаксическому анализатору, свернутому вручную. - person vyom   schedule 20.09.2011