无法根据 boost::spirit::qi 中的规则创建语法

发布于 2024-12-25 18:17:07 字数 1150 浏览 2 评论 0原文

我第一次尝试使用 Spirit 库。到目前为止我很喜欢它,但我发现自己无法根据预定义的规则构建语法,即使在尝试深受文档启发的示例时也是如此!

这是我的问题的核心:

#include <boost/spirit/home/qi.hpp>
using boost::spirit::qi::ascii::space_type;
using boost::spirit::qi::grammar;
using boost::spirit::qi::phrase_parse;

template<typename P>
bool test_parser(char const* input, P const& p) {
  char const* f(input);
  char const* l(f + strlen(f));
  return parse(f, l, p) && f == l;
}

struct my_grammar : grammar<char const*, space_type> {
  my_grammar() : base_type(r) {
    r = boost::spirit::qi::int_;
  }
  rule<char const*, space_type> r;
} g;
bool b = test_phrase_parser("5", g);

这是编译器说的:

错误:没有匹配的函数可用于调用“test_phrase_parser(const char [6], ph_files_parsing::process_parsing::test_method()::my_grammar&)”

注意:候选人是:

注意:模板 bool test_phrase_parser(const char*, const P&)

如果我替换

bool b = test_phrase_parser("5", g);

bool b = test_phrase_parser("5", boost::spirit::qi::int_);

一切正常提前非常感谢任何可以提供帮助的人。

(Boost版本为1.48)

I am trying to use the Spirit library for the first time. I am enjoying it so far but I find myself unable to build a grammar from predefined rules, even when trying examples heavily inspired by the documentation!

Here is the heart of my problem :

#include <boost/spirit/home/qi.hpp>
using boost::spirit::qi::ascii::space_type;
using boost::spirit::qi::grammar;
using boost::spirit::qi::phrase_parse;

template<typename P>
bool test_parser(char const* input, P const& p) {
  char const* f(input);
  char const* l(f + strlen(f));
  return parse(f, l, p) && f == l;
}

struct my_grammar : grammar<char const*, space_type> {
  my_grammar() : base_type(r) {
    r = boost::spirit::qi::int_;
  }
  rule<char const*, space_type> r;
} g;
bool b = test_phrase_parser("5", g);

And this is was the compiler says:

error: no matching function for call to ‘test_phrase_parser(const char [6], ph_files_parsing::process_parsing::test_method()::my_grammar&)’

note: candidate is:

note: template bool test_phrase_parser(const char*, const P&)

It all works fine if I replace

bool b = test_phrase_parser("5", g);

by

bool b = test_phrase_parser("5", boost::spirit::qi::int_);

Many thanks in advance to anyone who can help.

(Boost version is 1.48)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

美胚控场 2025-01-01 18:17:07

您的问题原来是常见问题(在底部)。

由于语法有一个跳过解析器,因此必须

 phrase_parse()

使用 parse() 来调用它。例如,

return phrase_parse(f, l, p, boost::spirit::ascii::space) && f == l;

Your question turns out to be frequently-asked (at the bottom).

Since the grammar has a skip-parser, it must be invoked with

 phrase_parse()

instead of just parse(). For example,

return phrase_parse(f, l, p, boost::spirit::ascii::space) && f == l;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文