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_
必要があると思いますが、それをどうすればよいでしょうか? パーサーの合成値にアクセスするにはどうすればよいですか?