我一直在學習boost :: spirit,並且遇到了語法動作在語法構造過程中被評估的混淆。下面的代碼產生輸出:在語法構造函數中評估的語義動作(或不是?)
string=
我的假設是,該輸出作爲語義動作的一部分附接至orule
。
有沒有辦法避免這種行爲?或者如果我在語義動作中使用std::cout
,我會需要忍受嗎?
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <iostream>
#include <string>
namespace phx = boost::phoenix;
namespace qi = boost::spirit::qi;
template <typename Iterator>
struct my_grammar : qi::grammar<Iterator, std::string() >
{
my_grammar() : my_grammar::base_type(orule)
{
using qi::_1;
using qi::_2;
using qi::attr;
using qi::string;
using phx::val;
orule = string("abc") [ std::cout << "string=" << _1 << std::endl ];
}
qi::rule< Iterator, std::string() > orule;
};
int main()
{
typedef std::string::const_iterator iterator_type;
typedef my_grammar<iterator_type> parser;
parser my_parser; // Our grammar
return 0;
}
謝謝您的回答 - 這給了我進一步洞察到這些語義動作實際上是怎麼回事 – Jimmy 2014-11-21 22:15:56