gpt4 book ai didi

c++ - 解析字符串的 Boost.Spirit 语义操作不起作用

转载 作者:行者123 更新时间:2023-11-28 03:33:48 28 4
gpt4 key购买 nike

我尝试编写一个 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”,代码会编译,但 phrase_parse() 对于输入 “print foo.txt” 返回 false。如果我注释掉 [ boost:bind(...) ] phrase_parse() 返回 true。

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

最佳答案

我相信你的问题是你试图将一个精神占位符传递给 boost::bind,它通常只适用于它的内置占位符(你已经用 隐藏了使用 qi::_1 )。我会尝试添加定义 BOOST_SPIRIT_USE_PHOENIX_V3,添加 #include "boost/phoenix.hpp" 然后去 boost::phoenix::bind(&my_parser::test, this, _1 ) 代替。

关于c++ - 解析字符串的 Boost.Spirit 语义操作不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11740518/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com