Парсинг YAML - lex или ручная работа?

Пытаюсь написать простенький парсер YAML, читал спецификацию с yaml.org, перед тем, как начать, мне было интересно, лучше ли написать парсер, накрученный вручную, или использовать lex(flex/bison). Я посмотрел на libyaml (библиотека C) - похоже, не использует lex/yacc. YAML (исключая стили потока) кажется более линейно-ориентированным, поэтому проще написать синтаксический анализатор вручную или использовать flex/bison Спасибо.


person vyom    schedule 19.09.2011    source источник
comment
Рассматривали ли вы просто использование стандартного готового синтаксического анализатора YAML? Или вы конкретно заинтересованы в создании собственного? Также обратите внимание, что lex и flex являются генераторами сканеров, а не генераторами парсеров; чтобы выполнить синтаксический анализ, вы хотели бы использовать yacc или bison.   -  person templatetypedef    schedule 20.09.2011
comment
@templatetypedef Я заинтересован в создании собственного.   -  person vyom    schedule 20.09.2011
comment
@templatetypedef Вероятно, я не ясно изложил свой вопрос. Я понимаю, что lex — это просто токенизатор. Я хотел знать, подходит ли структура YAML flex/bison или синтаксическому анализатору, свернутому вручную.   -  person vyom    schedule 20.09.2011
comment
Я должен предупредить, что flex/bison не будет работать для разбора YAML. YAML1.2 имеет более 200 синтаксических правил, большинство из которых требуют сопоставления отступов, что почти невозможно правильно реализовать с помощью токенизатора flex (в частности, несколько отступов не могут быть сопоставлены даже с помощью сложных хаков flex). Вам нужен токенизатор, который соблюдает правила отступов. Если я могу порекомендовать один из них: RE/flex содержит пример токенизатора и парсера YAML1.2.   -  person Dr. Alex RE    schedule 12.02.2020


Ответы (1)


Этот ответ, по сути, является ответом на вопрос: должен ли я создавать собственный синтаксический анализатор или использовать генератор синтаксических анализаторов? и не имеет ничего общего с YAML. Но тем не менее он ответит на ваш вопрос.

Вопрос, который вам нужно задать, заключается не в том, работает ли это с данным языком/грамматикой, а в том, чувствую ли я уверенность в реализации этого. Правда в том, что большинство форматов, которые вы хотите анализировать, будут работать только со сгенерированным парсером. Другая истина заключается в том, что можно анализировать даже сложные языки с помощью простого написанного от руки парсера рекурсивного спуска.

Среди прочего, я написал анализатор рекурсивного спуска для EDDL (C и структурированные элементы) и парсер bison/flex для INI. Я выбрал эти примеры, потому что они идут вразрез с интуицией, а внешние требования продиктовали решение.

Поскольку я установил на техническом уровне, что это возможно, почему вы предпочли бы одно другому? На этот вопрос действительно сложно ответить, вот несколько мыслей по этому поводу:

  • Написать хороший лексер действительно сложно. В большинстве случаев имеет смысл использовать flex для генерации лексера. Нет особого смысла вручную создавать собственный лексер, если только у вас нет действительно экзотических входных форматов.
  • Использование bison или подобных генераторов делает грамматику, используемую для синтаксического анализа, явно видимой. Основное преимущество здесь в том, что разработчик, обслуживающий ваш парсер, через пять лет сразу увидит используемую грамматику и сможет сравнить ее с любыми спецификациями.
  • Использование парсера с рекурсивным спуском делает совершенно понятным, что происходит в парсере. Это обеспечивает простые средства для изящного разрешения конфликтов Гарри. Вы можете написать простое if вместо перестановки всей грамматики в LALR1.
  • При разработке парсера вы можете замазать детали написанным от руки парсером, с помощью bison это практически невозможно. В бизоне грамматика должна работать, иначе генератор ничего не сделает.
  • Bison великолепно указывает на формальные ошибки в грамматике. К сожалению, вы остались один, чтобы исправить их. При ручной сборке синтаксического анализатора вы обнаружите недостатки только тогда, когда синтаксический анализатор читает чепуху.

Это не однозначный ответ ни для того, ни для другого, но он указывает вам правильное направление. Поскольку кажется, что вы пишете синтаксический анализатор для развлечения, я думаю, вам следует написать оба типа синтаксических анализаторов.

person rioki    schedule 17.06.2014