Boost.Spirit 替代解析器并行化
Boost.Spirit Alternative Parser parallelization
我正在使用具有许多替代子规则的 x3 规则解析缓冲区。
实际上,我有来自不同 GPS 设备的数据,我的主要解析器如下所示:
auto gps_r = device1_r | device2_r | device3_r;
bool ok = x3::parse(...,gps_r,..);
我知道我可以为输入数据和每个设备规则并行调用 x3::parse()
。但这可能不适用于某些递归解析(比如 SAX DOM 解析)。
我的问题更具理论性:是否有任何尝试使 Alternative Parser 异步(例如,使用 boost.coroutines2)以进行并行解析?
通常没有并行化的空间,因为组合语法试图尽可能少地执行前瞻和回溯。在这种情况下,并行解析的任何好处都将被线程生成和同步开销所抵消。
如果您的语法实际上像示例中那样从头开始分支 - 您可以将其重写为 运行 多个并行 x3::parse
。
当前的 Spirit 替代解析器实现也存在问题,因为它没有展平表达式树(虽然它是二叉树,但通常非常不平衡)。
我正在使用具有许多替代子规则的 x3 规则解析缓冲区。 实际上,我有来自不同 GPS 设备的数据,我的主要解析器如下所示:
auto gps_r = device1_r | device2_r | device3_r;
bool ok = x3::parse(...,gps_r,..);
我知道我可以为输入数据和每个设备规则并行调用 x3::parse()
。但这可能不适用于某些递归解析(比如 SAX DOM 解析)。
我的问题更具理论性:是否有任何尝试使 Alternative Parser 异步(例如,使用 boost.coroutines2)以进行并行解析?
通常没有并行化的空间,因为组合语法试图尽可能少地执行前瞻和回溯。在这种情况下,并行解析的任何好处都将被线程生成和同步开销所抵消。
如果您的语法实际上像示例中那样从头开始分支 - 您可以将其重写为 运行 多个并行 x3::parse
。
当前的 Spirit 替代解析器实现也存在问题,因为它没有展平表达式树(虽然它是二叉树,但通常非常不平衡)。