C ++ 0x / C ++ 11 лямбды еще не поддерживаются Boost Spirit 1
Редактировать Видимо, улучшена поддержка (сегодня я тестировал более старую версию 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