![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
NumericsBoost , ,
Похожие наchlit,СтритЦифровые парсеры также являются примитивными. Численные парсеры размещаются на своем участке, чтобы придать этому важному строительному блоку лучшую фокусировку. Фреймворк включает в себя пару предварительно определенных объектов для разбора подписанных и неподписанных целых чисел и реальных чисел. Эти парсеры полностью параметричны. Большинство важных аспектов численного анализа могут быть точно скорректированы в соответствии с требованиями. Это включает в себя основание радикса, минимальное и максимальное количество допустимых цифр, показатель, фракцию и т.д. Политика контролирует поведение парсеров реальных чисел. Существуют некоторые предопределенные политики, охватывающие наиболее распространенные форматы реальных чисел, но при необходимости пользователь может предоставить свои собственные. uint_parserЭтот класс является самым простым среди членов пакета цифр.uint_parserможет разбирать неподписанные целые числа произвольной длины и размера. Парсерuint_parserможет использоваться для разбора обычных примитивных целых чисел C/C++ или даже пользовательских скалярных чисел, таких как бигинты (неограниченные точные целые числа). Как и большинство классов в Духе,uint_parserявляется классом шаблонов. Шаблонные параметры тонко настраивают его поведение. uint_parser настолько гибкий, что другие числовые парсеры реализуются с использованием его в качестве основы.
Следующий пример показывает, как uint_parser может использоваться для разбора тысяч отдельных чисел. Пример может правильно разобрать числа, такие как 1 234 567 890. uint_parser<unsigned, 10, 1, 3> uint3_p; // 1..3 digits uint_parser<unsigned, 10, 3, 3> uint3_3_p; // exactly 3 digits ts_num_p = (uint3_p >> *(',' >> uint3_3_p)); // our thousand separated number parser bin_p,oct_p,uint_pиhex_pявляются объектами генератора парсера, предназначенными для использования в выражениях. Вот пример правила, которое анализирует ограниченный список чисел Comma. (Мы видели этодо):
Позже мы увидим, как можно извлечь действительные числа, парсируемые числовыми парсерами. Мы разберемся с этим, когда перейдем к разделу оспециализированных действиях. int_parserint_parserможет разбирать подписанные целые числа произвольной длины и размера. Это почти то же самое, чтоuint_parser. Единственное различие заключается в дополнительной задаче разбора знака'+'или'-', предшествующего числу. Интерфейс класса такой же, как у uint_parser.
real_parserreal_parserможет анализировать реальные числа произвольной длины и размера, ограниченные его параметрическим типомT.real_parser— класс шаблонов с 2 параметрами шаблона. Вот интерфейс шаблонаreal_parser: template< typename T = double, typename RealPoliciesT = ureal_parser_policies<T> > struct real_parser; Первым параметром шаблона является его числовой базовый типТ. Этоудваивается.
Второй шаблонный параметр — класс, который группирует все политики и по умолчанию вureal_parser_policies
Политики по умолчанию предоставляются для решения наиболее распространенных случаев (есть много способов представления и, следовательно, анализа реальных чисел). В большинстве случаев достаточно настройки по умолчаниюreal_parserи может использоваться прямо из коробки. На самом деле, существует четыреreal_parser, предварительно определенные для немедленного использования:
Мы уже виделиreal_p.ureal_pявляется его неподписанным вариантом. Strict RealsЦелые числа считаются подмножеством реальных чисел, поэтомуreal_pиureal_pраспознают целые числа (без точки) как реальные числа.strict_real_pиstrict_ureal_pявляются эквивалентными парсерами, которыетребуют наличияточки для числа, которое считается успешным совпадением. Advanced: real_parser policiesПолитика парсера разбивает реальное число на 6 шагов:
И взаимодействие этих подпарсинговых задач далее контролируется этими 3 политиками:
[править] sign_parser and sign_pПрежде чем мы перейдем к следующему шагу, мы включим небольшой парсер полезности, чтобы облегчить разбор'-'или'+'знака. Хотя легко написать одно: sign_p = (ch_p('+') | '-'); Невозможно извлечь фактический знак (положительный или отрицательный), не прибегая к семантическим действиям. У парсера sign_p есть атрибут bool, возвращенный абоненту через объект соответствия, который после парсинга устанавливается наистинное, если парсированный знак отрицательный. Этот атрибут определяет, был ли устранен отрицательный знак. Примеры: bool is_negative; r = sign_p[assign_a(is_negative)]; или просто... // directly extract the result from the match result's value bool is_negative = sign_p.parse(scan).value(); Парсер Sign_p ожидает, что прилагаемые семантические действия будут иметь подпись (см.Специализированные действиядля более подробной информации), совместимую с: Подпись для функций:
Подпись для функторов:
ureal_parser_policiestemplate <typename T> struct ureal_parser_policies { typedef uint_parser<T, 10, 1, -1> uint_parser_t; typedef int_parser<T, 10, 1, -1> int_parser_t; static const bool allow_leading_dot = true; static const bool allow_trailing_dot = true; static const bool expect_dot = false; По умолчанию ureal_parser_policies использует целочисленные числовые парсеры более низкого уровня для выполнения своей работы. real_parser_policiestemplate <typename T> struct real_parser_policies : public ureal_parser_policies<T> { template <typename ScannerT> static typename parser_result<sign_parser, ScannerT>::type parse_sign(ScannerT& scan) { return sign_p.parse(scan); } }; Обратите внимание, как политика real_parser_policies заменилаparse_signureal_parser_policies, из которых она подразделяется. По умолчанию real_parser_policies просто используетsign_pвместоscan.no_match()на шагеparse_sign. strict_ureal_parser_policies and strict_real_parser_policiestemplate <typename T> struct strict_ureal_parser_policies : public ureal_parser_policies<T> { static const bool expect_dot = true; }; template <typename T> struct strict_real_parser_policies : public real_parser_policies<T> { static const bool expect_dot = true; }; Опять же, эта политика заменила просто политику, которую они хотели, отличную от их суперклассов. Специализированныеполитики реального парсера могут повторно использовать некоторые из дефолтов при замене нескольких. Например, следующая политика парсера реального числа, которая анализирует тысячи отдельных чисел максимум с двумя десятичными числами и без экспоненты.
template <typename T> struct ts_real_parser_policies : public ureal_parser_policies<T> { // 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 typedef uint_parser<int, 10, 1, 2> uint2_t; typedef uint_parser<T, 10, 1, -1> uint_parser_t; typedef int_parser<int, 10, 1, -1> int_parser_t; ////////////////////////////////// 2 decimal places Max template <typename ScannerT> static typename parser_result<uint2_t, ScannerT>::type parse_frac_n(ScannerT& scan) { return uint2_t().parse(scan); } ////////////////////////////////// No exponent
Copyright © 1998-2002 Joel de Guzman
Статья Numerics раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |