簡體   English   中英

用於解析字符串的Boost.Spirit語義動作不起作用

[英]Boost.Spirit semantic action to parse a string does not work

我嘗試編寫一個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。

有誰知道我做錯了什么? 謝謝。

我相信你的問題是你試圖將一個精神占位符傳遞給boost::bind ,它通常只適用於它的內置占位符(你using qi::_1隱藏了它)。 我會嘗試添加定義BOOST_SPIRIT_USE_PHOENIX_V3 ,添加#include "boost/phoenix.hpp" ,然后轉到boost::phoenix::bind(&my_parser::test, this, _1 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM