![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Real Number Parsers (float_, double_, etc.)Boost , Spirit 2.5.2 , Numeric Parsers
|
Имя |
---|
|
|
|
boost::spirit::long_double //
alias: boost::spirit::qi::long_double |
![]() | Note |
---|---|
|
template <typename T, typename RealPolicies> struct real_parser;
Параметр |
Описание |
По умолчанию |
---|---|---|
| Числовой базовый тип числового парсера. | нет |
| Политика контролирует поведение парсера. | |
Notation
n
Объект T
, числовой базовый тип.
num
Буквальное число, любое реальное значение или Ленивый аргумент , оценивающий реальное значение.
RP
A RealPolicies
(тип).
exp
int
экспонента.
b
Флаг bool
.
f
, l
ForwardIterator
. первая/последняя пара итераторов.
Семантика выражения определяется только там, где она отличается от или не определена в PrimitiveParser
.
Выражение |
Семантика |
---|---|
float_ double_ long_double
| Проанализируйте реальное с помощью политики по умолчанию ( |
lit(num) float_(num) double_(num) long_double(num)
| Сопоставьте буквальный |
real_parser< T, RealPolicies >() real_parser< T, RealPolicies >() [ORIG_END] --> | Парсировать реал типа |
real_parser< T, RealPolicies >()(num)
| Сопоставьте буквальный |
Выражение |
Атрибут |
---|---|
lit(num)
| |
float_ float_(num)
| |
double_ double_(num)
| double |
long_double long_double(num)
| long double |
real_parser< T, RealPolicies >() real_parser< T, RealPolicies >()(num)
| |
O(N), где N - число символов (включая цифры, показатель, знак и т.д.), которые анализируются.
T
Тип числового основания T
, минимальные требования к выражению, перечисленные ниже, должны быть действительными. Обратите внимание, что дополнительные требования могут быть наложены таможенной политикой.
Выражение |
Семантика |
---|---|
| По умолчанию. |
| Построение из |
| Добавление. |
| Вычитание. |
| Умножение. |
| |
| Максимальные цифры для |
| Максимальные показатели для |
| |
| Минимальное значение |
| Умножить |
| |
| Возвращение |
![]() | Note |
---|---|
Приведенные выше дополнительные характеристики реального числа духов позволяют пользовательским реализациям реализовывать эффективные парсеры реального числа. Например, для некоторых пользовательских реальных чисел масштабирование до базового 10 экспонента является очень дешевой операцией. |
RealPolicies
Параметр шаблона RealPolicies
представляет собой класс, который группирует все политики, контролирующие поведение парсера. Политика контролирует поведение парсеров реальных чисел.
По умолчанию real_policies<T>
. По умолчанию обеспечивается уход за наиболее распространенным случаем (есть много способов представления и, следовательно, разбора реальных чисел). В большинстве случаев политики по умолчанию являются достаточными и могут использоваться прямо из коробки. Они предназначены для разбора чисел с плавающей точкой в стиле C/C++ формы nnn.fff
, где nnn
является дробной частью, fff
является 'e'
или 'E'
и eee-'
с дополнительным обнаружением NaN и Inf в соответствии со стандартом C99 и предлагаемым для включения в стандарт C++0x: nan, nan(...), inf и infinity (соответствие нечувствительно к случаю). Это соответствует следующей грамматике:
sign = lit('+') | '-' ; nan = -lit("1.0#") >> no_case["nan"] >> -('(' >> *(char_ - ')') >> ')') ; inf = no_case[lit("inf") >> -lit("inity")] ; floating_literal = -sign >> ( nan | inf | fractional_constant >> -exponent_part | +digit >> exponent_part ) ; fractional_constant = *digit >> '.' >> +digit | +digit >> -lit('.') ; exponent_part = (lit('e') | 'E') >> -sign >> +digit ;
Существует четыре RealPolicies
, предопределенные для немедленного использования:
Table 4. Predefined Policies
Политика |
Описание |
---|---|
| Без подписи. |
| Со знаком. |
| Без знака требуется точка. |
strict_real_policies<double> |
![]() | Note |
---|---|
Целые числа считаются подмножеством реальных чисел, поэтому, например, |
RealPolicies
Expression RequirementsДля моделей RealPolicies
должны быть действительны следующие выражения:
Выражение |
Семантика |
---|---|
| Разрешить ведущую точку. |
| |
| Требуется точка. |
| Просмотрите знак префикса (например, '-'). Возврат |
| Просмотрите целое число слева от десятичной точки. Возврат |
RP::parse_dot(f,
l) | Просмотрите десятичную точку. Возврат |
| Парсировать дробь после десятичной точки. Возврат |
| Просмотрите префикс экспоненты (например, 'e'). Возврат |
| Проанализируйте фактический показатель. Возврат |
| Вернитесь |
RP::parse_inf(f,
l,
n) |
Функции parse_nan
и parse_inf
вызываются всякий раз, когда:
число для разбора не начинается с цифры (после успешного разбора необязательного знака)
или
после того, как реальное число значения 1 (не имеющее экспоненциальной части и дробной части значения 0) было разобрано.
Первый вызов распознает представления NaN или Inf, начиная с нецифрового символа (например, NaN, Inf, QNaN и т. Д.). Второй вызов распознает форматы представления, начинающиеся с 1.0
(например, "1.0#NAN"
или "1.0#INF"
и т.д.).
Функции должны вернуться, если Nan или Inf были найдены. В этом случае атрибут n
должен быть установлен на соответствующее значение (NaN или Inf). После этого факультативный знак будет автоматически применяться.
RealPolicies
SpecializationsСамый простой способ реализовать правильную политику реального разбора — вывести новый тип из типа real_policies
, переопределяя аспекты разбора, которые необходимо изменить. Например, вот реализация предопределенных strict_real_policies
:
template <typename T> struct strict_real_policies : real_policies<T> { static bool const expect_dot = true; };
![]() | Note |
---|---|
Испытательный ремень для примера (примеров) ниже представлен в разделе Основные примеры. |
Некоторые используют декларации:
using boost::phoenix::val; using boost::spirit::qi::double_; using boost::spirit::qi::real_parser; using boost::spirit::qi::lit;
Базовый анализ реальных чисел:
// double test_parser("+12345e6", double_); test_parser("-12345e6", double_); test_parser("+12345e6", double_(12345e6)); test_parser("-12345e6", double_(-123456e6)); test_parser("+12345e6", double_(val(12345e6))); test_parser("-12345e6", double_(val(-123456e6))); // literals test_parser("+12345e6", lit(12345e6)); test_parser("-12345e6", lit(-123456e6)); test_parser("+12345e6", lit(val(12345e6))); test_parser("-12345e6", lit(val(-123456e6)));
Правила реального номера:
/////////////////////////////////////////////////////////////////////////////// // These policies can be used to parse thousand separated // numbers with at most 2 decimal digits after the decimal // point. e.g. 123,456,789.01 /////////////////////////////////////////////////////////////////////////////// template <typename T> struct ts_real_policies : boost::spirit::qi::ureal_policies<T> { // 2 decimal places Max template <typename Iterator, typename Attribute> static bool parse_frac_n(Iterator& first, Iterator const& last, Attribute& attr) { return boost::spirit::qi:: extract_uint<T, 10, 1, 2, true>::call(first, last, attr); } // No exponent template <typename Iterator> static bool parse_exp(Iterator&, Iterator const&) { return false; } // No exponent template <typename Iterator, typename Attribute> static bool parse_exp_n(Iterator&, Iterator const&, Attribute&) { return false; } // Thousands separated numbers template <typename Iterator, typename Attribute> static bool parse_n(Iterator& first, Iterator const& last, Attribute& attr) { using boost::spirit::qi::uint_parser; namespace qi = boost::spirit::qi; uint_parser<unsigned, 10, 1, 3> uint3; uint_parser<unsigned, 10, 3, 3> uint3_3; T result = 0; if (parse(first, last, uint3, result)) { bool hit = false; T n; Iterator save = first; while (qi::parse(first, last, ',') && qi::parse(first, last, uint3_3, n)) { result = result * 1000 + n; save = first; hit = true; } first = save; if (hit) attr = result; return hit; } return false; } };
И его использование:
real_parser<double, ts_real_policies<double> > ts_real; test_parser("123,456,789.01", ts_real); test_parser("123,456,789.01", ts_real(123456789.01));
Статья Real Number Parsers (float_, double_, etc.) раздела Spirit 2.5.2 Numeric Parsers может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Numeric Parsers ::
реклама |