如果文件以Boost Spirit Qi解析器结尾,则不会触发预期失败 当文件在一个规则的中间以剩余的期望结束时,它不会触发预期错误,当然,它不能解析。

如果文件以Boost Spirit Qi解析器结尾,则不会触发预期失败 当文件在一个规则的中间以剩余的期望结束时,它不会触发预期错误,当然,它不能解析。,boost,boost-spirit,Boost,Boost Spirit,触发该行为的简化示例如下: data_var_decls_r %= (lit("data") > lit('{')) > lit('}'); 如果输入仅为 data { 则不会触发最终预期}的预期错误 有没有办法处理超出文件结尾的预期错误?将其变成一个自包含的示例: 看到了吗 没有期望失败 即使使用space skipper,它仍会抛出: 我也看到了 这不是一个独立的示例谢谢你提供了一个简单的独立示例。我希望这是一个已知的问题和已知的解决方案。我将尝试将我们

触发该行为的简化示例如下:

data_var_decls_r
  %= (lit("data")
       > lit('{'))
  > lit('}');
如果输入仅为

data {
则不会触发最终预期}的预期错误


有没有办法处理超出文件结尾的预期错误?

将其变成一个自包含的示例:

看到了吗

没有期望失败

即使使用space skipper,它仍会抛出:

我也看到了


这不是一个独立的示例谢谢你提供了一个简单的独立示例。我希望这是一个已知的问题和已知的解决方案。我将尝试将我们的几十个文件和语法简化为一个示例来演示这个问题。我可能不会成功,因为我们的语法在这一点上是非常巨大的,我不知道这个问题可能来自哪里。有什么关于调试语法的一般提示吗?我最后只是写了很多回调语义动作来打印进度,但这是一个非常耗时的过程。很多回调语义动作都在上面,所以只需搜索我的答案。。。。链接到公共回购可能会有所帮助。看看BOOST_SPIRIT_DEBUG*宏。还有,我应该发布一个新问题还是编辑?我从来都不确定StackOverflow的协议,我看到开发人员在编辑问题时总是互相大喊大叫。我可以看出,我最初的问题惹恼了一些人,足以否决它,我不想继续惹恼那些可能帮助我的人。在这个阶段,我认为这取决于你。通过改变问题使现有答案无效是不礼貌的,但我并不介意这种情况,因为我认为这个问题在目前的形式下没有用处。OTOH发布了一个新的,确实给了它一个新的机会,w.r.t.投票。[我想,否决票可能来自于对我的评论投了赞成票的同一个人。]我对语法进行了大量扩展,以匹配我们现有的语法,看起来问题出在我们的结果处理代码中,而不是精神上。非常感谢这个简单的示例——它对调试非常有帮助。
#include <boost/spirit/include/qi.hpp>

namespace test {
    using namespace boost::spirit::qi;

    rule<std::string::const_iterator> rule = lit("data") > '{' > '}';
}

int main() {
    std::string const input("data{");

    bool ok = parse(input.begin(), input.end(), test::rule);
}
#include <boost/spirit/include/qi.hpp>

namespace test {
    using namespace boost::spirit::qi;

    rule<std::string::const_iterator, space_type> rule = lit("data") > '{' > '}';
}

int main() {
    std::string const input("data{");

    bool ok = phrase_parse(input.begin(), input.end(), test::rule, test::space);
}