Создайте анализатор, используя Boost Spirit в C ++, который создает AST, используя существующие классы - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь написать синтаксический анализатор с использованием Boost Spirit в C ++. Я хочу вывод этого парсера в виде объектов класса. Я читал о семантических действиях, но я не уверен, как создавать объекты класса в этих действиях.

Кроме того, я прочитал, что "boost phoenix" - хорошая библиотека для использования для семантических действий. Но, не нашел обширных примеров его использования с наддувом.

Буду признателен за любую помощь или направление. Спасибо.

1 Ответ

0 голосов
/ 07 ноября 2018

Да. Вы можете. Просто начните с урока:

https://www.boost.org/doc/libs/1_68_0/libs/spirit/doc/html/spirit/qi/tutorials.html

Важно помнить, что семантические действия не предпочтительный метод для создания ваших узлов AST. Это, кажется, повторяющийся паттерн, исходящий от инструментов стиля Flex / Bison.

Вместо этого предпочитайте использовать автоматический синтез и распространение атрибутов . Таким образом вы получите встроенный DSL-дух , как и было задумано. Это то, что уменьшает объем работы и место для ручной ошибки. См. Также Повышение духа: «Семантические действия - это зло»?

Если вы

  • нужен уровень контроля, или вам
  • абсолютно необходимо оптимизировать фазы парсера
  • или по другой причине (например, семантический анализ необходим для устранения неоднозначности сканирования токена)

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

> Кроме того, я прочитал, что «boost phoenix» - хорошая библиотека для использования для семантических действий.

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

Я бы сказал, что Семантические действия Spirit X3 - гораздо более тонкий подход, когда в вашем распоряжении весь язык C ++ 14 без библиотечной героики. Это уменьшает кривую обучения и позволяет использовать существующий код без, например, упаковка в полиморфные вызовы, адаптация с BOOST_PHOENIX_ADAPT_ * и т. д.

Просто для удовольствия, вот парсер X3, где я реализовал базовое подмножество Phoenix для X3 в одном заголовочном файле: https://github.com/sehe/expression-parsers/tree/x3-c++17

> Но, не нашел обширных примеров его использования с наддувами.

Полагаю, если вы будете искать (мои) ответы на этом сайте, это шведский стол "все, что вы можете съесть". Конечно, вы всегда можете опубликовать конкретные вопросы, которые у вас есть.

...