3

boost::spirit::qi のフードの下で正確に何が起こるかを理解したいです。数値と加算/減算操作で構成される式を解析および計算する単純なパーサーがあるとします。

int main()
{
    std::string INPUT_DATA = "12e-1 + 3.4 - .67";
    typedef std::string::iterator iterator_type;
    iterator_type begin = std::begin(INPUT_DATA);
    iterator_type end = std::end(INPUT_DATA);

    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::qi::ascii;

    auto parser = qi::double_[qi::_val = qi::_1]                      // (1)
        >> *(
                (qi::lit('+') >> qi::double_[qi::_val += qi::_1])     // (2)
                |
                (qi::lit('-') >> qi::double_[qi::_val -= qi::_1])     // (3)
            );

    double result;
    bool ok = qi::phrase_parse(begin, end, parser, ascii::space, result);

    if ( ok  && begin == end)
    {
        std::cout << "parsed, result = " << result << std::endl;
    }
    else
    {
        std::cout << "not parsed" << std::endl;
    }

    return 0;
}

qi::_valセマンティック アクションが行で(1)どのように発生し、同じ値(2)を参照するのですか? (3)boost::phoenix を使用せずに同じ結果を得るにはどうすればよいですか?

から解析された値を受け取る一連のファンクターを作成するqi::double_必要があると思いますが、それをどうすればよいでしょうか? パーサーの合成値にアクセスするにはどうすればよいですか?

4

1 に答える 1