C++ boost spirit 2:有没有办法知道解析器的进度百分比是多少?

C++ boost spirit 2:有没有办法知道解析器的进度百分比是多少?,c++,boost,boost-spirit,C++,Boost,Boost Spirit,我设法将一个pgn文件解析成几个游戏 然而,由于我要处理的文件有很多游戏,在我最近的电脑上处理这个过程可能需要两分钟。这就是为什么我想使用这个解析器在GUI应用程序上设置进度条的动画 我认为最简单的方法是“问”spirit他已经处理了多少个字符,还有多少个字符。(或剩余并已处理的行数) 可能吗?如果是这样,我需要如何修改解析器文件以获得此比率?您可以使用line\u pos\u迭代器,并可能使用存储库中的iter\u pos原语 (@GuyGreer:)无法知道所涉及的回溯量(否则,首先就不需

我设法将一个pgn文件解析成几个游戏

然而,由于我要处理的文件有很多游戏,在我最近的电脑上处理这个过程可能需要两分钟。这就是为什么我想使用这个解析器在GUI应用程序上设置进度条的动画

我认为最简单的方法是“问”spirit他已经处理了多少个字符,还有多少个字符。(或剩余并已处理的行数)


可能吗?如果是这样,我需要如何修改解析器文件以获得此比率?

您可以使用
line\u pos\u迭代器
,并可能使用存储库中的
iter\u pos
原语

  • (@GuyGreer:)无法知道所涉及的回溯量(否则,首先就不需要回溯)。所以,最好的办法是接受这样一个事实,即您得到的某种“平均吞吐量”有时可能有点突发或滞后。如果你的语法不平衡,这些变化不仅仅是噪声,你应该首先考虑语法/解析器定义。

  • 为了解决不知道流长度的“问题”,除了不将其作为流之外,您无法修复它

    我建议使用内存映射。您可以使用
    boost::iostreams
    boost::interprocess
    mmap
    中的工具


我估计我至少有3个答案演示了这个答案中提到的每一种技术,所以我只想在这个网站上搜索它们。

作为替代,我想你可以将迭代器包装在一个自定义类型周围,该类型将报告作为迭代器位置的进度。这将有点不准确,因为解析器将需要回溯,所以要么让进程像解析器那样来回移动,要么就这样忍受不准确。这确实是一个有趣的想法。我仍在想我将如何处理回溯:如果这种情况太频繁,我需要一种方法来忽略它们,让进度条保持在最高级的位置。只要在迭代器移动时跟踪距离范围起点的最大距离,并且只在最大值发生变化时更新进度。这对我来说非常合理。谢谢。我在istream文档中寻找了一种监听器,以增加我的个人计数器:但我没有找到任何人可以帮助我。此外,由于它是一个流,在读取所有文件之前,我无法知道字符总数。因此,我需要至少再通过一次才能计算字符/线条。我可以申请什么解决办法?我不认为我表明你可以知道需要多少回溯。。。至于不知道流的长度,这不只是文件的大小吗?@GuyGreer谁说了关于文件的事?如果流是一个插座呢?哦,是的,没错。我是从他链接到的问题中得到的,在这个问题中,他正在解析一个文件。一般来说,是的,您无法知道流的长度。请使用语义操作。或者使用
on_error
(有一个编译器示例,使用它来用源位置IIRC注释AST节点),现在,您可以在这里看到最终结果:。如果你把问题贴出来,我会解释一下。