Глядя на этот пример для реализации анализатора Spirit, что-то меня поймало, когда я пытался написать нечто подобное.
Параметр шаблона атрибута грамматики (std::map<std::string, std::string>()
)а параметр шаблона подписи в правилах (например, 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
};
Я никогда раньше этого не видел, и тогда я случайно пропустил это при написании своей собственной версии.Это привело к тому, что мой синтаксический анализатор не генерировал правильное время выполнения вывода (карта вывода пуста).
Какова цель этих скобок?Я предполагаю, что это делает атрибут этого правила объектом этого типа.