Фреймворк 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";
}
внешние ссылки
- Фреймворк Spirit Parser Страница SourceForge
- Документация в проекте Boost
- Статья дизайнера Джоэля де Гусмана о духе в журнале доктора Добба
Эта статья, посвященная инструментам программирования, является незавершенной . Вы можете помочь Википедии, расширив ее . |