Фреймворк Spirit Parser - Spirit Parser Framework

Духа 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. Если 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 ) Match 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";
}

внешние ссылки