Boost Spirit 规则和语法中模板参数中的括号
看看 这个用于实现 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是一个函数类型。
()
使这意味着“一个返回std::map
并且没有参数的函数”。如果没有
()
,类型只是“std::map
”,这是不正确的。This is a function type.
The
()
makes this mean "a function that returns astd::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.