Boost Spirit 规则和语法中模板参数中的括号

发布于 2024-11-27 19:23:56 字数 1310 浏览 1 评论 0原文

看看 这个用于实现 Spirit 解析器的示例,当我试图编写类似的东西时,有些东西让我感到困惑。

语法的属性模板参数(std::map())和规则的签名模板参数(例如qi::rule< ;Iterator, std::string()> key, value) 包含括号。

namespace qi = boost::spirit::qi;

template <typename Iterator>
struct keys_and_values
  : qi::grammar<Iterator, std::map<std::string, std::string>()> // <- parentheses here
{
    keys_and_values()
      : keys_and_values::base_type(query)
    {
        query =  pair >> *((qi::lit(';') | '&') >> pair);
        pair  =  key >> -('=' >> value);
        key   =  qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9");
        value = +qi::char_("a-zA-Z_0-9");
    }
    qi::rule<Iterator, std::map<std::string, std::string>()> query; // <- parentheses here
    qi::rule<Iterator, std::pair<std::string, std::string>()> pair; // <- parentheses here
    qi::rule<Iterator, std::string()> key, value; // <- parentheses here
};

我以前从未见过这一点,并且在编写自己的版本时无意中省略了这一点。这导致我的解析器无法生成正确的输出运行时间(输出映射为空)。

这些括号的目的是什么?我的猜测是,这使得该规则的属性成为该类型的对象。

Looking at this example for implementing a Spirit parser, something caught me out when I was trying to write something similar.

The attribute template parameter of the grammar (std::map<std::string, std::string>()) and the signature template parameter of the rules (e.g. qi::rule<Iterator, std::string()> key, value) contain parentheses.

namespace qi = boost::spirit::qi;

template <typename Iterator>
struct keys_and_values
  : qi::grammar<Iterator, std::map<std::string, std::string>()> // <- parentheses here
{
    keys_and_values()
      : keys_and_values::base_type(query)
    {
        query =  pair >> *((qi::lit(';') | '&') >> pair);
        pair  =  key >> -('=' >> value);
        key   =  qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9");
        value = +qi::char_("a-zA-Z_0-9");
    }
    qi::rule<Iterator, std::map<std::string, std::string>()> query; // <- parentheses here
    qi::rule<Iterator, std::pair<std::string, std::string>()> pair; // <- parentheses here
    qi::rule<Iterator, std::string()> key, value; // <- parentheses here
};

I have never seen this before, and I unintentionally omitted then when writing my own version. This lead to my parser not generating the correct output run time (the output map is empty).

What is the purpose of these parentheses? My guess is that this makes the attribute of this rule an object of that type.

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

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

发布评论

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

评论(1

兮颜 2024-12-04 19:23:56
std::map<std::string, std::string>()

这是一个函数类型。

() 使这意味着“一个返回 std::map 并且没有参数的函数”。

如果没有 (),类型只是“std::map”,这是不正确的。

std::map<std::string, std::string>()

This is a function type.

The () makes this mean "a function that returns a std::map<std::string, std::string> and has no parameters."

Without the (), the type is just "std::map<std::string, std::string>," which is not correct.

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