提升精神x3 int32 | double_无法解析double

时间:2016-06-19 11:28:35

标签: c++ parsing c++14 boost-spirit boost-spirit-x3

我正在尝试编写解析器,解析int32_tdouble。 作为第一次尝试,我写了这个解析器:

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

为什么这个解析器在双打时失败?

2 个答案:

答案 0 :(得分:5)

您的问题与this question非常相似。

当整数解析器首先出现在你的语法中时,它是首选。对于输入"12.9",解析器将解析"12.9的{​​{1}}的整数部分,并将停留在12 live example

您必须颠倒顺序,以便双解析器优先于整数1:

.

这将适用于const auto double_or_int = boost::spirit::x3::double_ | boost::spirit::x3::int32; live example

但是,由于双解析器也会解析一个整数,所以即使输入为"12.9",您也总是会得到一个: live example

为了防止这种情况,您需要一个严格的双解析器:

"12"

live example

答案 1 :(得分:1)

我也不知道Inflate1,这听起来很方便。

我曾经这样更直接地解决这个问题:

strict_real_policies

如果您查看http://www.json.org/上的流程图 你可以看到这三个字符涵盖了一个数字可以被解析成浮点数的所有合法方式。 (在我的特殊问题上。)

相关问题