c++ - Boost.Spirit 替代解析器并行化
问题描述
我正在使用具有许多替代子规则的 x3 规则解析缓冲区。实际上,我有来自不同 GPS 设备的数据,我的主要解析器如下所示:
auto gps_r = device1_r | device2_r | device3_r;
bool ok = x3::parse(...,gps_r,..);
我知道我可以x3::parse()
为输入数据和每个设备规则实现并行调用。但这可能不适用于某些递归解析(例如 SAX DOM 解析)。
我的问题更具理论性:是否有任何尝试使替代解析器异步(例如,使用 boost.coroutines2)以进行并行解析?
解决方案
通常没有并行化的空间,因为组合语法试图执行尽可能少的前瞻和回溯。在这种情况下,并行解析的任何好处都将被线程产生和同步开销所抵消。
如果您的语法实际上像所示示例中那样从头开始分支 - 您可以重写它以x3::parse
并行运行多个。
当前的 Spirit 备用解析器实现也存在问题,因为它不会展平表达式树(虽然它是二叉树,但通常非常不平衡)。
推荐阅读
- reactjs - 调用抽屉内选择文本字段的 setState() onChange 时出错
- php - “找不到类 'Nexmo\\Laravel\\Facades\\Nexmo'”错误
- css - CSS 媒体设备不适用
- python - 服务器重新启动后如何使 Flask 应用程序启动并运行?
- c# - 为什么在 C# 中实现为 DLL 时的 C 代码较慢
- c# - Asp.net mvc保存可拖动元素的位置
- ffmpeg - 如何使用 ffmpeg 将两个 .g729 文件合并为一个 .wav 文件?
- schema - nilify_all、nothing 和 delete_all 之间的 Ecto.Schema 区别?
- react-native - 无法读取http请求响应的错误
- bash - awk 中的三元运算符