Ну, на самом деле не сложный парсер, а парсер, который парсирует сложные числа. На этот раз мы используемФениксдля выполнения семантических действий.
Вот простое парсерное выражение для сложных чисел:
'(' >> double_ >> -(',' >> double_) >> ')'
| double_
Что нового? Ну, у нас есть:
- Альтернативы: например.<
a|b
>. Сначала попробуйте<a
>. Если получится, хорошо. Если нет, попробуйте другой вариант<b
>. - Варианты: например, -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,
(
'(' >> double_[ref(rN) = _1]
>> -(',' >> double_[ref(iN) = _1]) >> ')'
| double_[ref(rN) = _1]
),
space);
if (!r || first != last)
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]](/img/note.png) | Note |
---|
Те, у кого есть опыт использованияФеникса, могут быть спутаны с заполнителями, которые мы используем (то есть<_1 >,<_2 >и т. д.). Пожалуйста, имейте в виду, что мы не используем те же заполнители, что и Phoenix. Обратите внимание, что мы вытаскиваем заполнители из пространства имен<boost::spirit::qi >. Эти заполнители специально разработаны для Духа. |
<double_
>Парсер прикрепляет это действие:
ref(n) = _1
Это приписывает парсированный результат (фактически, атрибут<double_
>) n.<ref(n)
>говорит Фениксу, что<n
>является изменчивой ссылкой.<_1
>является заполнителем Феникса для парсированного атрибута результата.