gpt4 book ai didi

boost - 您如何使用 boost spirit x3 实现自定义解析器对象,以便它与 skipper 一起玩得很好?

转载 作者:行者123 更新时间:2023-12-04 10:40:33 25 4
gpt4 key购买 nike

我知道我可以通过使用适当的“解析”成员函数模板创建一个对象来实现自定义解析器,但我不知道我需要做什么才能使它在上下文中使用 skipper ,这似乎需要做.也就是说,下面我预计两种情况都会成功,但第二种情况失败:

namespace x3 = boost::spirit::x3;

namespace parser {

struct foobar : x3::parser<foobar> {

using attribute_type = std::string;

template<typename Iterator, typename Context, typename RContext, typename Attribute>
bool parse(Iterator& first, Iterator const& last, Context const& context,
RContext const& rcontext, Attribute& attr) const
{
static const std::string foobar_str = "foobar";
auto i = first;
auto j = foobar_str.begin();
while (i != last && j != foobar_str.end()) {
if (*i++ != *j++)
return false;
}
first = i;
attr = foobar_str;
return true;
};
};

const auto foo = foobar();
}

int main()
{
std::string input = "foobarfoobarfoobar";
std::vector<std::string> strings;

auto foobars = parser::foo >> parser::foo >> parser::foo;

bool success = x3::phrase_parse(input.begin(), input.end(), foobars, x3::space, strings);
if (success)
std::cout << "yes\n"; // yes for this one
else
std::cout << "no\n";

input = "foobar foobar foobar";
success = x3::phrase_parse(input.begin(), input.end(), foobars, x3::space, strings);
if (success)
std::cout << "yes\n";
else
std::cout << "no\n"; // no because of the spaces
}

最佳答案

您可以通过从上下文中获取它来简单地应用 skipper 。何时使用它由您决定(例如,后跳过是否是行为的一部分),但我认为当有事件的 skipper 时,预跳过是隐含的。

如果你从 x3::parser_base 继承,你可以简单地调用

 skip_over(f, l, ctx);

做这项工作。

参见示例 X3 parse rule doesn't compile

关于boost - 您如何使用 boost spirit x3 实现自定义解析器对象,以便它与 skipper 一起玩得很好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59952992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com