gpt4 book ai didi

c++ - 使用简单的 Boost::Spirit 语法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:55 26 4
gpt4 key购买 nike

我无法使用语法,所以我简化了它,直到它只解析一个整数。仍然无法正常工作。语法如下:

template<typename Iterator>
struct rangeGrammar : qi::grammar<Iterator, int()>
{
rangeGrammar() :
rangeGrammar::base_type(number)
{
using qi::int_;
using qi::_1;
using qi::_val;

number = int_[_val = _1];
}
qi::rule<Iterator, int()> number;
};

它应该只解析一个整数(我知道我可以告诉解析函数使用 int_ 作为语法,但我不想知道这个例子中有什么问题)。

我的解析函数是:

/* n is a std::string provided by the user */
rangeGrammar<std::string::const_iterator> grammar;
int num = 0;
qi::phrase_parse(n.start(), n.end(), grammar, num);
std::cout << "Number: " << num << std::endl;

我收到以下编译器错误:

/boost/spirit/home/qi/reference.hpp: In member function ‘bool boost::spirit::qi::reference::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator >, Context = boost::spirit::context, boost::spirit::locals<> >, Skipper = boost::spirit::unused_type, Attribute = int, Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator >, int(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>]’: /boost/spirit/home/qi/parse.hpp:89:82: instantiated from ‘bool boost::spirit::qi::parse(Iterator&, Iterator, const Expr&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator >, Expr = rangeGrammar<__gnu_cxx::__normal_iterator > >, Attr = int]’ ../parameter_parser.h:95:46: instantiated from here boost/spirit/home/qi/reference.hpp:43:71: error: no matching function for call to ‘boost::spirit::qi::rule<__gnu_cxx::__normal_iterator >, int(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::parse(__gnu_cxx::__normal_iterator >&, const __gnu_cxx::__normal_iterator >&, boost::spirit::context, boost::spirit::locals<> >&, const boost::spirit::unused_type&, int&) const’ cc1plus: warnings being treated as errors /boost/spirit/home/qi/reference.hpp:44:9: error: control reaches end of non-void function * exit status 1 *

无法弄清楚问题是什么。任何帮助将不胜感激。

最佳答案

答:语法 没有 一点错误,但您使用的是qi::phrase_parse这需要一个船长。使用 qi::parse 问题就消失了。

注意 1: 使用 [_val=_1] 是完全多余的;没有语义属性的规则享有自动属性传播

注意 2:您可能希望使用 qi::match 进行如下解析:

#include <boost/spirit/include/qi_match.hpp>

const std::string input = "1234";
std::istringstream iss(input);
iss >> qi::match(qi::int_ [ std::cout << qi::_1 ]);

最后为了您的兴趣,这里有一个“doParse”函数的框架和运行测试,显示了良好气功练习的更多元素:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;

template<typename Iterator>
struct rangeGrammar : qi::grammar<Iterator, int()>
{
rangeGrammar() : rangeGrammar::base_type(number)
{
number = qi::int_;
}
qi::rule<Iterator, int()> number;
};

bool doParse(const std::string& input)
{
typedef std::string::const_iterator It;
It f(begin(input)), l(end(input));

try
{
rangeGrammar<It> p;
int data;

bool ok = qi::parse(f,l,p,data);
if (ok)
{
std::cout << "parse success\n";
std::cout << "data: " << data << "\n";
}
else std::cerr << "parse failed: '" << std::string(f,l) << "'\n";

if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n";
return ok;
} catch(const qi::expectation_failure<It>& e)
{
std::string frag(e.first, e.last);
std::cerr << e.what() << "'" << frag << "'\n";
}

return false;
}

int main()
{
bool ok = doParse("1234");
return ok? 0 : 255;
}

关于c++ - 使用简单的 Boost::Spirit 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16779684/

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