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

Exa*_*gon 4 c++ parsing boost-spirit c++14 boost-spirit-x3

我正在尝试编写一个解析器,它解析a int32_t或a double.作为第一次尝试,我写了这个解析器:

const auto int_or_double = boost::spirit::x3::int32 | boost::spirit::x3::double_;
Run Code Online (Sandbox Code Playgroud)

我期望得到一个boost::variant<int32_t, double> 解析器成功解析整数,12, 100, -42, 7但它无法解析双打像13.243, 42.7, 12.0 -10000.3

这是一个现场演示

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

m.s*_*.s. 6

你的问题与这个问题非常相似.

当整数解析器首先出现在你的语法中时,它是首选.对于输入"12.9"解析器将解析的整数部分的"12.9这是12与将在停止..live example

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

const auto double_or_int =  boost::spirit::x3::double_ | boost::spirit::x3::int32;
Run Code Online (Sandbox Code Playgroud)

这将适用于"12.9":live example

但是,由于双解析器也会解析整数,因此即使输入为"12": live example

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

boost::spirit::x3::real_parser<double, boost::spirit::x3::strict_real_policies<double> > const double_ = {};
Run Code Online (Sandbox Code Playgroud)

live example