首页 > 解决方案 > 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)以进行并行解析?

标签: c++boostboost-spirit

解决方案


通常没有并行化的空间,因为组合语法试图执行尽可能少的前瞻和回溯。在这种情况下,并行解析的任何好处都将被线程产生和同步开销所抵消。

如果您的语法实际上像所示示例中那样从头开始分支 - 您可以重写它以x3::parse并行运行多个。

当前的 Spirit 备用解析器实现也存在问题,因为它不会展平表达式树(虽然它是二叉树,但通常非常不平衡)。


推荐阅读