C++ 分析字符串的Boost.Spirit语义操作无效
我尝试编写一个Boost.Spirit解析器,解析一个字符串,该字符串应该表示一个简单的命令,比如print foo.txt。每次输入符合语法时,都应该调用一个语义动作 代码如下:C++ 分析字符串的Boost.Spirit语义操作无效,c++,boost-spirit,boost-spirit-qi,C++,Boost Spirit,Boost Spirit Qi,我尝试编写一个Boost.Spirit解析器,解析一个字符串,该字符串应该表示一个简单的命令,比如print foo.txt。每次输入符合语法时,都应该调用一个语义动作 代码如下: template<class Iterator> struct my_parser : qi::grammar<Iterator, void(), qi::ascii::space_type> { void test(std::string const & s) const
template<class Iterator>
struct my_parser : qi::grammar<Iterator, void(), qi::ascii::space_type>
{
void test(std::string const & s) const
{
std::cerr << s << std::endl;
}
my_parser() : my_parser::base_type(print)
{
using qi::_1;
using qi::char_;
filename =
*qi::char_("a-zA-Z_0-9./ ")
;
print =
qi::lit("print")
>> filename [ boost::bind(&my_parser::test, this, _1) ]
;
}
qi::rule<Iterator, std::string()> filename;
qi::rule<Iterator, void(), qi::ascii::space_type> print;
};
如果我试图编译它,我会得到如下结果:
no match for call to ‘(const boost::_mfi::cmf1<void, parser::my_parser<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > >, const std::basic_string<char>&>) (parser::my_parser<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > >* const&, const boost::phoenix::actor<boost::spirit::argument<0> >&)’
例如,如果我将_1替换为abc,则代码将编译,但输入print foo.txt的短语_parse返回false。如果我注释掉[boost:bind…]短语_parse返回true
有人知道我做错了什么吗?谢谢。我相信您的问题在于,您试图将一个精灵占位符传递给boost::bind,它通常只适用于使用qi:\u 1隐藏的内置占位符。我会尝试添加define-BOOST\u-SPIRIT\u-USE\u-PHOENIX\u V3,添加include-BOOST/PHOENIX.hpp,然后选择BOOST::PHOENIX::bind和my-parser::test,这个,\u 1就可以了。+1这就行了。我相信只要用气就可以了:(1);也会起作用,因为这是使用的方式。您可以在页面底部的重要部分找到问题的描述。