【发布时间】:2019-02-01 18:37:51
【问题描述】:
我正在尝试解析这种类型的字符串
1.2e3ex
1.2e3 ex
并且已经设置
x3::float_ >> "ex"
很遗憾,解析失败
1ex
完整示例代码:
#include <iostream>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
const auto parser = x3::float_ >> "em";
int main()
{
std::string input = "1em";
auto first = input.begin();
auto last = input.end();
float value{};
bool result = x3::phrase_parse(first, last, parser, x3::blank, value);
if(result)
{
if(first == last)
std::cout << "parse succesful: " << value << '\n';
else
std::cout << "incomplete parse: " << value << '\n';
}
else
std::cout << "parse unsuccesful\n";
}
live on Coliru 也可用。
看来我需要跳过一些障碍,
struct non_scientific_float_policy : x3::real_policies<float>
{
template <typename Iterator>
static bool parse_exp(Iterator& first, Iterator const& last)
{
return false;
}
};
const auto non_scientific_float = x3::real_parser<float, non_scientific_float_policy>{};
const auto parser = non_scientific_float >> "em" | x3::float_ >> "em";
没有别的办法吗?
【问题讨论】:
-
您能否提供minimal reproducible example 来说明问题所在?
-
@Nicol 第一个 coliru 链接就是这样。 "em" 中的 'e' 被
float_解析器贪婪地占用,并且从未返回。 -
"第一个 coliru 链接就是这样。" MCVE 进入您的帖子,而不是链接。
-
@rubenvb: Yes, there is such a rule.
-
@NicolBolas 关于 meta 的两个帖子,规则不成立。至少链接到我忽略的帮助中心中的位:“如果可以创建一个可以链接到的问题的实时示例(例如,在sqlfiddle.com 或jsbin.com),那么就这样做 - 而且将代码包含在您的问题本身中。并非每个人都可以访问外部站点,并且链接可能会随着时间的推移而中断。” Anyhoo,所有精彩的代码现在都可以供您观赏了。
标签: c++ boost c++17 boost-spirit boost-spirit-x3