2013-06-30 3 views
2

Как разобрать строку, которая может содержать либо double, либо int в зависимости от того, установлена ​​ли точка. Например. 6.0 имеет двойной тип, а 6 - тип int. Правило будетboost :: spirit :: qi :: double_ и boost :: spirit :: qi :: int_

rule<it,boost::variant<int,double>,skipper> r = qi::double_|qi::int_; 

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

+0

Связанный: ["Parse int or double using boost spirit"] (http://stackoverflow.com/q/13261502/2378523) – sehe

ответ

4

В дополнение к прагматическому подходу дается interjay, посмотрите на real_parser_policies:

real_parser<double,strict_real_policies<double>>() | int_ 

будет одинаково хорошо.


который я иногда использую себя (вы должны быть в состоянии найти an answer doing this на SO). Обратите внимание, однако, что являются проблемами, когда вход является, например, 123e-5 (который будет разбирать int, оставив e-5 unparsed).

+0

123e-5 должен быть разобран: floating_literal = -знак >> (нан | инф | fractional_constant >> exponent_part | + digit >> exponent_part ) ; exponent_part = (lit ('e') | 'E') >> -sign >> + digit ; – programmist

0

Я думаю, что это должно работать:

(int_ >> !lit('.')) | double_ 

Это будет соответствовать целое число, только если это не следует точка. В противном случае он будет соответствовать двойному.

+0

Если вы хотите менее тяжелый откат, используйте строгую реальную политику – sehe

+0

Кроме того, -1 as этот ответ не работает для Inf/NaN/экспоненциальное (думать о '1e10', например) – sehe

Смежные вопросы