提升精神 x3 int32 | double_ 无法解析 double
boost spirit x3 int32 | double_ fails to parse double
我正在尝试编写一个解析器,它可以解析 int32_t
或 double
。
作为第一次尝试,我编写了这个解析器:
const auto int_or_double = boost::spirit::x3::int32 | boost::spirit::x3::double_;
我希望得到 boost::variant<int32_t, double>
解析器成功解析了像 12, 100, -42, 7
这样的整数,但它无法解析像 13.243, 42.7, 12.0 -10000.3
这样的双精度数
这里有直播demo
为什么这个解析器在双打上失败?
您的问题与this question非常相似。
当整数解析器在您的语法中首先出现时,这是首选。对于输入 "12.9"
,解析器将解析 "12.9
的整数部分,即 12
,并将在 .
处停止。 live example
您必须颠倒顺序,以便双解析器优于整数解析器:
const auto double_or_int = boost::spirit::x3::double_ | boost::spirit::x3::int32;
这现在适用于 "12.9"
:live example
然而,由于双精度解析器也解析一个整数,所以即使输入是 "12"
,你也总是会得到一个双精度:live example
为了防止这种情况,你需要一个严格的双重解析器:
boost::spirit::x3::real_parser<double, boost::spirit::x3::strict_real_policies<double> > const double_ = {};
我也不知道 strict_real_policies
,这听起来很方便。
我曾经像这样以更直接的方式解决这个问题:
(qi::int_ >> !lit('.') >> !lit('e') >> !lit('E')) | qi::float_
如果你看看http://www.json.org/上的流程图
您可以看到这三个字符涵盖了可以将数字解析为浮点数的所有合法方式。 (在我的特定问题中。)
我正在尝试编写一个解析器,它可以解析 int32_t
或 double
。
作为第一次尝试,我编写了这个解析器:
const auto int_or_double = boost::spirit::x3::int32 | boost::spirit::x3::double_;
我希望得到 boost::variant<int32_t, double>
解析器成功解析了像 12, 100, -42, 7
这样的整数,但它无法解析像 13.243, 42.7, 12.0 -10000.3
这里有直播demo
为什么这个解析器在双打上失败?
您的问题与this question非常相似。
当整数解析器在您的语法中首先出现时,这是首选。对于输入 "12.9"
,解析器将解析 "12.9
的整数部分,即 12
,并将在 .
处停止。 live example
您必须颠倒顺序,以便双解析器优于整数解析器:
const auto double_or_int = boost::spirit::x3::double_ | boost::spirit::x3::int32;
这现在适用于 "12.9"
:live example
然而,由于双精度解析器也解析一个整数,所以即使输入是 "12"
,你也总是会得到一个双精度:live example
为了防止这种情况,你需要一个严格的双重解析器:
boost::spirit::x3::real_parser<double, boost::spirit::x3::strict_real_policies<double> > const double_ = {};
我也不知道 strict_real_policies
,这听起来很方便。
我曾经像这样以更直接的方式解决这个问题:
(qi::int_ >> !lit('.') >> !lit('e') >> !lit('E')) | qi::float_
如果你看看http://www.json.org/上的流程图 您可以看到这三个字符涵盖了可以将数字解析为浮点数的所有合法方式。 (在我的特定问题中。)