用于解析字符串的Boost.Spirit语义动作不起作用

时间:2012-07-31 12:51:21

标签: 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
    {
        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> >&)’

如果我用“abc”替换_1,例如代码编译,但是对于输入“print foo.txt”,phrase_parse()将返回false。如果我注释掉 [boost:bind(...)] phrase_parse(),则返回true。

有谁知道我做错了什么?感谢。

1 个答案:

答案 0 :(得分:2)

我相信您的问题是您正在尝试将精灵占位符传递给boost::bind,这通常仅适用于其内置占位符(您已使用using qi::_1隐藏)。我会尝试添加定义BOOST_SPIRIT_USE_PHOENIX_V3,添加#include "boost/phoenix.hpp",然后转而使用boost::phoenix::bind(&my_parser::test, this, _1 )