gpt4 book ai didi

c++ - Boost Spirit 报错

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:43 24 4
gpt4 key购买 nike

我的解析器语法底部有以下错误处理程序:

qi::on_error<qi::fail>(
launch,
std::cerr << phoenix::val("Paring error in ") << spirit::_4 << std::endl
<< phoenix::construct<std::string>(spirit::_3, spirit::_2)
<< std::endl
);

问题是解析器的输入没有事先被新行打断,因此生成的错误语句将是源代码中从错误点到结尾的所有 行。有没有直接的替代方法

phoenix::construct<std::string>(spirit::_3, spirit::_2)

只打印发生错误的那一行?如果我尝试只搜索 '\n',Phoenix 语义给我带来了麻烦。

最佳答案

我们需要创建一个可以接受 Spirit 参数的 Phoenix 函数。

// lazy function for error reporting
struct ReportError {
// the result type must be explicit for Phoenix
template<typename, typename, typename, typename>
struct result { typedef void type; };

// contract the string to the surrounding new-line characters
template<typename Iter>
void operator()(Iter first_iter, Iter last_iter,
Iter error_iter, const qi::info& what) const {
std::string first(first_iter, error_iter);
std::string last(error_iter, last_iter);
auto first_pos = first.rfind('\n');
auto last_pos = last.find('\n');
auto error_line = ((first_pos == std::string::npos) ? first
: std::string(first, first_pos + 1))
+ std::string(last, 0, last_pos);
auto error_pos = (error_iter - first_iter) + 1;
if (first_pos != std::string::npos) {
error_pos -= (first_pos + 1);
}
std::cerr << "Parsing error in " << what << std::endl
<< error_line << std::endl
<< std::setw(error_pos) << '^'
<< std::endl;
}
};

const phoenix::function<ReportError> report_error = ReportError();

然后我们只需在错误处理程序中调用此函数即可。

qi::on_error<qi::fail>(
launch,
report_error(spirit::_1, spirit::_2, spirit::_3, spirit::_4)
);

关于c++ - Boost Spirit 报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18193161/

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