【问题标题】:boost::spirit::qi::double_ and boost::spirit::qi::int_boost::spirit::qi::double_ 和 boost::spirit::qi::int_
【发布时间】:2013-06-30 17:08:14
【问题描述】:

如何根据是否设置点来解析可能包含 double 或 int 的字符串。例如。 6.0 是 double 类型, 6 是 int 类型。规则是

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

但是,在这种情况下,对于所有数字,流将被双倍馈送。

【问题讨论】:

标签: c++ boost-spirit


【解决方案1】:

除了interjay给出的务实方法1,看看real_parser_policies

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

同样好。


1 我有时会自己使用(你应该可以在 SO 上找到 an answer doing this)。但是请注意,当输入为例如123e-5(它会解析一个 int,而留下 e-5 未解析)。

【讨论】:

  • 123e-5 应该被解析: floating_literal = -sign >> ( nan | inf | fractional_constant >> !exponent_part | +digit >> exponent_part ) ;exponent_part = (lit('e') | ' E') >> -sign >> +digit ;
【解决方案2】:

我认为这应该可行:

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

只有当它后面没有点时它才会匹配一个整数。否则,它将匹配一个双精度。

【讨论】:

  • 如果你想要更少的回溯,使用严格的真实策略
  • 另外,-1 因为这个答案不适用于 Inf/NaN/指数表示法(例如考虑1e10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多