四、行动
到目前为止,本章中的示例只检测到两件事:解析器是否成功以及解析器在哪里结束。但是,解析器通常以某种方式处理数据,正如您将在下一个示例中看到的那样。
Example 11.9. Linking actions with parsers
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>
using namespace boost::spirit;
int main()
{
std::string s;
std::getline(std::cin, s);
auto it = s.begin();
bool match = qi::phrase_parse(it, s.end(),
qi::int_[([](int i){ std::cout << i << '\n'; })], ascii::space);
std::cout << std::boolalpha << match << '\n';
if (it != s.end())
std::cout << std::string{it, s.end()} << '\n';
}
示例 11.9 使用 boost::spirit::qi::int_ 解析一个整数,然后将该整数写入标准输出。这就是为什么一个动作与 boost::spirit::qi::int_ 相关联。动作是应用解析器时调用的函数或函数对象。链接是使用运算符 operator[] 完成的,它被 boost::spirit::qi::int_ 和其他解析器重载。示例 11.9 使用 lambda 函数作为操作,该操作需要一个 int 类型的