Boost Spirit 尚不支持 C++0x/C++11 lambda1
编辑显然支持改进(我今天早些时候用旧的 boost 版本进行了测试)。现在使用 Boost 1_48 和 g++ 4.6.1,just_work 出现以下内容。耶!
qi::as_string[]
我想会想知道qi::as_string 以获得暴露的属性为
std::string 而不是默认的std::vector<CharT>:
qi::parse(str.begin(), str.end(),
qi::as_string [ +qi::alpha ]
[
[](const std::string&){std::cout << s << '\n';}
]
>> (*(qi::char_(',') | qi::char_('\'')))
>> qi::uint_
[
[](int integer){std::cout << integer << '\n';}
]);
但在我看来,语法不是很友好。相反,我更喜欢phoenixV2:
qi::parse(str.begin(), str.end(),
qi::as_string [ +qi::alpha ] [ std::cout << _1 << '\n' ]
>> (*(qi::char_(',') | qi::char_('\'')))
>> qi::uint_ [ std::cout << _1 << '\n' ]);
这在句法上已经短了很多,也没有那么神秘了。来看看
一个有点人为的例子展示了其中的一些实际操作,另外将属性引用直接传递到 parse 函数中:
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <algorithm>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
bool reverse(std::string& value)
{
std::reverse(value.begin(), value.end());
return true; // false makes the parsing fail
}
int main()
{
std::string str("sometext,123");
auto f(str.begin()), l(str.end());
std::string s;
unsigned int i;
qi::parse(f,l,
qi::as_string [ +qi::alpha ] [ reverse ]
>> qi::omit [ *qi::char_(",\'") ]
>> qi::uint_,
s, i);
std::cout << s << std::endl;
std::cout << i << std::endl;
}
输出:
txetemos
123
1 PhoenixV3 可能在 1_48 中对此有一些支持(尚未检查);你会想要
#define BOOST_RESULT_OF_USE_DECLTYPE
#define BOOST_SPIRIT_USE_PHOENIX_V3
参见例如http://boost.2283326.n4.nabble.com/Boost-Spirit-Phoenix-V3-An-Overview-td3583792.html