Начальное состояние парсера Spirit X3?

Я просматривал документацию Boost.Spirit X3, которую мне удалось найти --- чего не так много --- и я думаю, что хотел бы использовать ее для своего следующего проекта синтаксического анализа. Примечательно, что я никогда не использовал Boost.Spirit Classic или V2, но использовал flex/bison и ANTLR.

Формат, который я ищу для анализа, в самом простом смысле выглядит так:

unimportant
foo
bar
# BEGIN
parse this
...
# END
ignore this

Где анализируется только текст между "# BEGIN" и "# END", а все остальное полностью игнорируется. Я пытаюсь найти эффективный способ сделать это в парсере X3. Некоторые идеи, которые у меня были:

  1. Используйте базовые функции поиска строк, чтобы ограничить диапазон синтаксического анализа. Это кажется худшим вариантом, так как текст будет обрабатываться несколько раз, а не за один проход.
  2. Загляните в Spirit.Lex. Опять же, я столкнулся с трудностями при поиске подходящего материала для чтения на Spirit.Lex, но похоже, что Lex предоставляет начальные состояния лексера, которые были бы традиционным способом обработки этой работы. Кроме того, поскольку X3 основан на C++14, а Spirit.Lex построен на основе lexertl, есть ли вариант конфигурации или способ использования Spirit.Lex с модернизированным lexertl14?
  3. Возможно, есть какой-то значимый способ справиться с этим в X3? Поскольку грамматика на самом деле чрезвычайно проста, я думаю, что наличие отдельного лексера — это излишество.

person Zac    schedule 04.02.2016    source источник


Ответы (1)


Пример в Использование Boost Spirit для разбора текстового файла с пропуском больших его частей применимо и к X3:

Прямой эфир на Coliru

Конечно, вы должны изменить его на свой вкус. Если вы выполните поиск qi seek в [SO], вы найдете больше примеров, некоторые из которых могут быть ближе к вашей цели.

person sehe    schedule 04.02.2016
comment
seek [ ] и опускание [ ] кажутся соответствующими инструментами, которые непосредственно выполняют то, о чем я просил. Спасибо. - person Zac; 06.02.2016