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

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

Дух можно использовать как для лексика и синтаксический анализ, вместе или по отдельности.

Эта структура является частью Библиотеки Boost.

Операторы

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

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

Пример

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

#включают <string>#включают <iostream>#включают <boost/spirit/include/qi.hpp>#включают <boost/spirit/include/phoenix.hpp> int главный(){  пространство имен ци = способствовать росту::дух::ци;  стандартное::нить Вход;   стандартное::cout << "Введите строку:  п";  Getline(стандартное::cin, Вход);  стандартное::cout << "Получил '" << Вход << "'. п";   беззнаковый считать = 0;  /*        Затем проанализируйте ввод (input.c_str ()),      с использованием парсера, построенного со следующей семантикой:      Ноль или более вхождений (          буквальная строка "кошка" (при совпадении увеличить счетчик "count")      или любой символ (который будет пропущен)      )     Парсер создается компилятором с использованием перегрузки оператора и     сопоставление шаблонов, поэтому фактическая работа выполняется внутри qi :: parse (), а     выражение, начинающееся с *, только инициализирует объект правила, который     функция использует.  */  авто правило = *(ци::горит("Кот") [ ++ци::_val ] | ци::пропускать[ци::char_]);  ци::разбирать(Вход.начинать(), Вход.конец(), правило, считать);    // Наконец, покажем результаты.  стандартное::cout << "Вход содержал" << считать << "появления слова" кошка " п";}

внешняя ссылка