我尝试编写一个 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
{
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”,phrase_parse() 会返回 false 。如果我用 true 注释掉[ boost:bind(...) ] phrase_parse() 返回。
有谁知道我做错了什么?谢谢。