【问题标题】:Expectation failure not triggered if file ends with Boost Spirit Qi parser如果文件以 Boost Spirit Qi 解析器结尾,则不会触发预期失败
【发布时间】:2017-07-25 15:07:30
【问题描述】:

当文件在具有剩余期望的规则中间结束时,它不会触发期望错误(它当然会解析失败)。

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

data_var_decls_r
  %= (lit("data")
       > lit('{'))
  > lit('}');

如果输入只有

data {

那么最终预期的} 的预期错误不会被触发。

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

【问题讨论】:

  • 这不是一个独立的例子

标签: boost boost-spirit


【解决方案1】:

把它变成一个独立的例子:

Live On Wandbox

#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);
}

确实会引发期望失败。

即使使用空格跳过,它仍然会抛出:

也看到Live On Wandbox

#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);
}

【讨论】:

  • 感谢简单的独立示例。我希望这是一个已知解决方案的已知问题。我将尝试将我们的几十个文件和语法简化为一个演示问题的示例。我可能不会成功,因为我们的语法在这一点上真的很大,我不知道这个问题可能来自哪里。在某处调试灵气语法有什么通用技巧吗?我最后只是写了很多回调语义动作来打印进度,但这是一个非常耗时的过程。
  • SO上有很多(只需搜索我的答案...)。指向公共回购的链接可能会有所帮助。查看BOOST_SPIRIT_DEBUG* 宏。还有,don't complicate with semantic actions.. :(
  • 另外,我应该发布一个新问题还是编辑?我从不确定 StackOverflow 上的协议,而且我看到开发人员一直在为编辑的问题互相大喊大叫。我可以看到,我最初的问题已经惹恼了一些人,以至于无法投反对票,我不想一直惹恼那些可能会帮助我的人。
  • 在这个阶段,我认为这取决于你。通过更改问题来使现有答案无效是一种不好的礼仪,但在这种情况下我并不介意(因为我认为该问题在当前形式下没有用)。 OTOH 发布一个新的确实给它一个新的机会 w.r.t.表决。 [我想,反对票可能来自对我的评论投赞成票的同一个人。]
  • 我广泛扩展了语法以匹配我们现有的语法,看起来问题出在我们的结果处理代码中,而不是在 Spirit Qi 中。非常感谢这个简单的例子——它对调试很有帮助。
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多