Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Introduction

Boost , ,

Introduction

Spirit - объектно-ориентированная рекурсивно-сценическая модель генератора парсера, реализованная с использованием методов мета-программирования шаблонов. Шаблоны экспрессии позволяют нам полностью приблизить синтаксис Расширенной формы Backus-Normal (EBNF) на C++.

Рамки Духа позволяют писать целевую грамматику исключительно на C++. Инлайновые грамматические спецификации EBNF могут свободно смешиваться с другим кодом C++ и, благодаря генеративной силе шаблонов C++, сразу могут быть исполняемыми. В ретроспективе обычные компилятор-компиляторы или парсер-генераторы должны выполнять дополнительный шаг перевода от исходного кода EBNF до кода C или C++.

Простой грамматический фрагмент EBNF:

    group       ::= '(' expression ')'
    factor      ::= integer | group
    term        ::= factor (('*' factor) | ('/' factor))*
    expression  ::= term (('+' term) | ('-' term))*

приблизится к использованию объектов Духа, как видно из этого фрагмента кода:

    group       = '(' >> expression >> ')';
    factor      = integer | group;
    term        = factor >> *(('*' >> factor) | ('/' >> factor));
    expression  = term >> *(('+' >> term) | ('-' >> term));

Благодаря магии шаблонов выражения, это совершенно действительный и исполняемый код C++. Правило производства экспрессия на самом деле является объектом, который имеет деловую функцию члена, которая делает работу с исходным кодом, написанным в грамматике, которую мы только что объявили. Да, это калькулятор. На данный момент мы упростим, пропустив заявления типа и определение правила integer, на которое ссылается factor. Правило производства экспрессия в нашей грамматической спецификации, традиционно называемой символом старта, может распознавать входы, такие как:

    12345
    -12345
    +12345
    1 + 2
    1 * 2
    1/2 + 3/4
    1 + 2 + 3 + 4
    1 * 2 * 3 * 4
    (1 + 2) * (3 + 4)
    (-1 + 2) * (3 + -4)
    1 + ((6 * 200) - 20) / 6
    (1 + (2 + (3 + (4 + 5))))

Конечно, мы внесли некоторые изменения в оригинальный синтаксис EBNF. Это делается для соответствия правилам синтаксиса C++. В частности, мы видим обилие сдвига >> операторов. Поскольку в C++ нет «пустые» операторы, просто невозможно написать что-то вроде:

    a b

как видно в математическом синтаксисе, например, означает умножение или, в нашем случае, как видно в синтаксисе EBNF, означает последовательность (b должен следовать a). Рамки используют смену > оператора вместо этого. Мы принимаем оператора > с стрелками, указывающими на право, что означает "следует". Так мы пишем:

    a >> b

Альтернативный оператор | и скобки () остаются таковыми. Оператор уступки = используется вместо EBNF ::=. И последнее, но не менее важное: звезда Kleene *, которая раньше была оператором постфикса в EBNF, становится префиксом. Вместо:

    a* //... in EBNF syntax,

мы пишем:

    *a //... in Spirit.

так как нет постфиксов, «*», в C/C++. Наконец, мы прекращаем каждое правило с вездесущим полуколоном, «;».



 

Статья Introduction раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 06:35:55/0.0081961154937744/1