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
这是一个现场演示
为什么这个解析器在双打时失败?
你的问题与这个问题非常相似.
当整数解析器首先出现在你的语法中时,它是首选.对于输入"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)
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |