Jump to content

Платформа парсера Spirit

Spirit Parser Framework — это объектно-ориентированная рекурсивного спуска структура генератора синтаксического анализатора шаблонов , реализованная с использованием методов метапрограммирования . Шаблоны выражений позволяют пользователям полностью аппроксимировать синтаксис расширенной формы Бэкуса-Наура (EBNF) на C++ . Объекты синтаксического анализатора составляются посредством перегрузки операторов , и в результате получается анализатор LL(∞) с обратным отслеживанием , способный анализировать довольно неоднозначные грамматики.

Spirit можно использовать как для лексического анализа , так и для синтаксического анализа, вместе или по отдельности.

Этот фреймворк является частью библиотек Boost .

Операторы

[ редактировать ]

Из-за ограничений языка C++ синтаксис Spirit был разработан с учетом приоритетов операторов C++, но при этом имеет сходство как с EBNF , так и с регулярными выражениями .

синтаксис объяснение
x >> y Сопоставьте x, за которым следует y.
x > y После совпадения x ожидайте y.
*x Соответствие x повторяется ноль или более раз. Это представляет звезду Клини ; В C++ отсутствует унарный постфиксный оператор *.
x | y Матч х. Если x не соответствует, попробуйте сопоставить y.
+x Сопоставьте серию из одного или нескольких вхождений x.
-x Соответствует x ноль или один раз.
x & y Сопоставьте x и y.
x - y Сопоставьте x, но не y.
x ^ y Сопоставьте x, или y, или оба в любом порядке.
x || y Сопоставьте x, или y, или x, за которым следует y.
x [ function_expression ] Выполните функцию/функтор, возвращенную function_expression, если x соответствует.
( x ) Соответствие x (можно использовать для группировки по приоритету)
x % y Сопоставьте одно или несколько вхождений x, разделенных вхождениями y.
~x Соответствует чему угодно, кроме x (только с классами символов, такими как ch_p или alnum_p)

В этом примере показано, как использовать встроенное выражение синтаксического анализатора с семантическим действием.

#include <string>
#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
 
int main()
{
  namespace qi = boost::spirit::qi;

  std::string input;
 
  std::cout << "Input a line: \n";
  getline(std::cin, input);
  std::cout << "Got '" << input << "'.\n";
 
  unsigned count = 0;
  /*  
      Next, parse the input (input.c_str()),
      using a parser constructed with the following semantics:
 
      Zero or more occurrences of (
          literal string "cat" (when matched, increment the counter "count")
      or  any character (which will be skipped)
      )

     The parser is constructed by the compiler using operator overloading and
     template matching, so the actual work is done within qi::parse(), and the
     expression starting with * only initializes the rule object that the parse
     function uses.

  */
  auto rule = *(qi::lit("cat") [ ++qi::_val ] | qi::omit[qi::char_]);
  qi::parse(input.begin(), input.end(), rule, count);
  

  // Finally, show results.
  std::cout << "The input contained " << count << " occurrences of 'cat'\n";
}
[ редактировать ]


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 5aeda5f56c486839e43456bd4dea5b46__1716219420
URL1:https://arc.ask3.ru/arc/aa/5a/46/5aeda5f56c486839e43456bd4dea5b46.html
Заголовок, (Title) документа по адресу, URL1:
Spirit Parser Framework - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)