Платформа парсера 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";
}
Ссылки
[ редактировать ]Внешние ссылки
[ редактировать ]- Страница GitHub с фреймворком Spirit Parser
- Платформа парсера Spirit
- Документация в проекте Boost
- Статья дизайнера Джоэла де Гузмана о духе в журнале Dr. Dobb's Journal.