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

Real Number Parsers (float_, double_, etc.)

Boost , Spirit 2.5.2 , Numeric Parsers

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
Description

real_parser может анализировать реальные числа произвольной длины и размера, ограниченные параметром шаблона T. Числовой базовый тип T может быть определяемым пользователем числовым типом, таким как фиксированное_точка (фиксированные точечные реалы) и большое число (неограниченные точные числа), при условии, что тип соответствует определенным требованиям к выражению (документировано ниже).

Header
// forwards to <boost/spirit/home/qi/numeric/real.hpp>
#include <boost/spirit/include/qi_real.hpp>

Кроме того, см. Включить структуру .

Namespace

Имя

boost::::lit : boost::spirit::qi::lit

boost::::float_ //lias: boost::spirit::qi::float_

boost::::double_ //lias: boost::spirit::qi::double_

boost::spirit::long_double // alias: boost::spirit::qi::long_double

[Note]Note

lit повторно используется парсерами и числовыми парсерами . В общем, char parser создается, когда вы проходите в персонаже, а числовой парсер создается, когда вы используете числовой буквальный.

Synopsis
template <typename T, typename RealPolicies>
struct real_parser;
Template parameters

Параметр

Описание

По умолчанию

T

Числовой базовый тип числового парсера.

нет

Реальная политика

Политика контролирует поведение парсера.

real_policies<T>

Model of

Notation

n

Объект T, числовой базовый тип.

num

Буквальное число, любое реальное значение или Ленивый аргумент , оценивающий реальное значение.

RP

A RealPolicies (тип).

exp

int экспонента.

b

Флаг bool.

f, l

ForwardIterator. первая/последняя пара итераторов.

Expression Semantics

Семантика выражения определяется только там, где она отличается от или не определена в PrimitiveParser.

Выражение

Семантика

float_
double_
long_double

Проанализируйте реальное с помощью политики по умолчанию (real_policies<T>).

lit(num)
float_(num)
double_(num)
long_double(num)

Сопоставьте буквальный num с политикой по умолчанию (real_policies<T>). Парсер выйдет из строя, если парсируемое значение не равно указанному значению.

real_parser<
    T, RealPolicies
>()

real_parser<
    T, RealPolicies
>()

[ORIG_END] -->

Парсировать реал типа T, используя RealPolicies.

real_parser<
    T, RealPolicies
>()(num)

Сопоставьте буквальный num типа T с использованием RealPolicies. Парсер выйдет из строя, если парсируемое значение не равно указанному значению.

Attributes

Выражение

Атрибут

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)

T

Complexity

O(N), где N - число символов (включая цифры, показатель, знак и т.д.), которые анализируются.

Minimum Expression Requirements for T

Тип числового основания T, минимальные требования к выражению, перечисленные ниже, должны быть действительными. Обратите внимание, что дополнительные требования могут быть наложены таможенной политикой.

Выражение

Семантика

T()

По умолчанию.

T(0)

Построение из int.

n + n

Добавление.

n - n<8

Вычитание.

n n<8

Умножение.

std::numeric_limits<T>::is_bounded

true или false, если T ограничен.

std::численные_лимиты<T>::цифры

Максимальные цифры для T, радиксовые цифры. Требуется только в том случае, если T ограничен.

std::numeric_limits<T>::digits10

Максимальные показатели для T, основание 10. Требуется только в том случае, если T ограничен.

std::численные_лимиты<T>::max()

std::численные_лимиты<T>::min()

Минимальное значение T. Требуется только в том случае, если T ограничен.

boost::spirit::traits::scale(exp,n>

Умножить n на 10^exp. Реализация по умолчанию предусмотрена для float, double и long double.

boost::spirit::traits::negate(b,n>

boost::spirit::traits::is_equal_to_one(n>

Возвращение истинное , если n равно 1.0. Реализация по умолчанию предусмотрена для float, double и long double.

[Note]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

Политика

Описание

ureal_policies<double>

Без подписи.

real_policies<double>

Со знаком.

strict_ureal_policies<double>

Без знака требуется точка.

strict_real_policies<double>


[Note]Note

Целые числа считаются подмножеством реальных чисел, поэтому, например, double_ также распознает целые числа (без точки). Чтобы избежать этой двусмысленности, strict_ureal_policies и strict_real_policies требуют наличия точки, чтобы число считалось успешным совпадением.

RealPolicies Expression Requirements

Для моделей RealPolicies должны быть действительны следующие выражения:

Выражение

Семантика

RP::allow_leading_dot

Разрешить ведущую точку.

RP::allow_trailing_dot

RP::expect_dot

Требуется точка.

RP::parse_sign(f,l:3>

Просмотрите знак префикса (например, '-'). Возврат истинно в случае успеха, в противном случае ложно.

RP::parse_n(f, l, n

Просмотрите целое число слева от десятичной точки. Возврат истинно в случае успеха, в противном случае ложно. В случае успеха поместите результат в n.

RP::parse_dot(f, l)

Просмотрите десятичную точку. Возврат истинно в случае успеха, в противном случае ложно.

RP::parse_frac_n(f, l, n

Парсировать дробь после десятичной точки. Возврат истинно в случае успеха, в противном случае ложно. В случае успеха поместите результат в n.

RP::parse_exp(f, l:3>

Просмотрите префикс экспоненты (например, 'e'). Возврат истинно в случае успеха, в противном случае ложно.

RP::parse_exp_n(f, l, n

Проанализируйте фактический показатель. Возврат истинно в случае успеха, в противном случае ложно. В случае успеха поместите результат в n.

RP::parse_nan(f, l, n>

Вернитесь истинно в случае успеха, в противном случае ложно . В случае успеха поместите результат в n.

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;
};
Example
[Note]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));


PrevUpHomeNext

Статья Real Number Parsers (float_, double_, etc.) раздела Spirit 2.5.2 Numeric Parsers может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Numeric Parsers ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 23:41:57/0.028439044952393/1