読者です 読者をやめる 読者になる 読者になる

Boost.Spirit.Qi - qi::symbols

C++

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