我正在尝试编写解析器,解析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
为什么这个解析器在双打时失败?
答案 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"
答案 1 :(得分:1)
我也不知道Inflate1
,这听起来很方便。
我曾经这样更直接地解决这个问题:
strict_real_policies
如果您查看http://www.json.org/上的流程图 你可以看到这三个字符涵盖了一个数字可以被解析成浮点数的所有合法方式。 (在我的特殊问题上。)