qi::symbolsを継承した型によってシンボルのテーブルを定義し、シンボルと値を対応付けることができます。また、その型のオブジェクトをパース式で使用することができます。
以下は、「文字列"one"を数値1と見なす」といったシンボルテーブルを定義しています。
#include <iostream> #include <string> #include <vector> #include <boost/spirit/include/qi.hpp> #include <boost/range/algorithm/for_each.hpp> namespace qi = boost::spirit::qi; struct number_ : public qi::symbols<char, int> { number_() { add("zero", 0) ("one", 1) ("two", 2) ("three", 3) ("four", 4) ("five", 5) ("six", 6) ("seven", 7) ("eight", 8) ("nine", 9) ; } } number; void disp(int x) { std::cout << x << ' '; } int main() { const std::string input = "one two three four five, 地球戦隊ファイブマン"; std::vector<int> result; std::string::const_iterator it = input.begin(); if (!qi::parse(it, input.end(), number % ' ', result)) { std::cout << "parse error" << std::endl; return 1; } boost::for_each(result, disp); }
1 2 3 4 5
JSONのパースなどで、"true"をbool型のtrueにパースする、といったことに使えるかもしれません。
追記:
と思ったら、bool_パーサーは"true"をbool型のtrueにパースするようですね…。
http://www.boost.org/doc/libs/1_46_1/libs/spirit/doc/html/spirit/qi/reference/numeric/boolean.html
参照:
Roman Numerals - Boost.Spirit.Qi Tutorial