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

Complex - Our first complex parser

Boost , Spirit 2.5.2 , Tutorials

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Ну, на самом деле не сложный парсер, а парсер, который парсирует сложные числа. На этот раз мы используемФениксдля выполнения семантических действий.

Вот простое парсерное выражение для сложных чисел:

    '(' >> double_ >> -(',' >> double_) >> ')'
|   double_

Что нового? Ну, у нас есть:

  1. Альтернативы: например.<a|b>. Сначала попробуйте<a>. Если получится, хорошо. Если нет, попробуйте другой вариант<b>.
  2. Варианты: например, -p. Сопоставьте парсер p 0 или один раз.

Представленный выше комплексный парсер гласит:

  • Одно или два действительных числа в скобках, разделенных запятой (второе число необязательно)
  • илиодно действительное число.

Этот парсер может анализировать сложные числа формы:

(123.45, 987.65)
(123.45)
123.45

На этот раз с действиями:

namespace client
{
    template <typename Iterator>
    bool parse_complex(Iterator first, Iterator last, std::complex<double>& c)
    {
        using boost::spirit::qi::double_;
        using boost::spirit::qi::_1;
        using boost::spirit::qi::phrase_parse;
        using boost::spirit::ascii::space;
        using boost::phoenix::ref;
        double rN = 0.0;
        double iN = 0.0;
        bool r = phrase_parse(first, last,
            //  Begin grammar
            (
                    '(' >> double_[ref(rN) = _1]
                        >> -(',' >> double_[ref(iN) = _1]) >> ')'
                |   double_[ref(rN) = _1]
            ),
            //  End grammar
            space);
        if (!r || first != last) // fail if we did not get a full match
            return false;
        c = std::complex<double>(rN, iN);
        return r;
    }
}

The full cpp file for this example can be found here: ../../example/qi/complex_number.cpp

[Note]Note

Те, у кого есть опыт использованияФеникса, могут быть спутаны с заполнителями, которые мы используем (то есть<_1>,<_2>и т. д.). Пожалуйста, имейте в виду, что мы не используем те же заполнители, что и Phoenix. Обратите внимание, что мы вытаскиваем заполнители из пространства имен<boost::spirit::qi>. Эти заполнители специально разработаны для Духа.

<double_>Парсер прикрепляет это действие:

ref(n) = _1

Это приписывает парсированный результат (фактически, атрибут<double_>) n.<ref(n)>говорит Фениксу, что<n>является изменчивой ссылкой.<_1>является заполнителем Феникса для парсированного атрибута результата.


PrevUpHomeNext

Статья Complex - Our first complex parser раздела Spirit 2.5.2 Tutorials может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

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