Распараллеливание альтернативного анализатора Boost.Spirit - PullRequest
0 голосов
/ 29 августа 2018

Я анализирую буфер, используя правило 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) для параллельного анализа?

1 Ответ

0 голосов
/ 29 августа 2018

Обычно нет места для распараллеливания, поскольку составные грамматики стараются выполнять как можно меньше запросов вперед и назад. В этом случае любые преимущества параллельного синтаксического анализа будут перевешиваться из-за появления потоков и синхронизации.

Если ваша грамматика фактически разветвляется с самого начала, как в показанном примере - вы можете переписать ее для параллельного выполнения нескольких x3::parse.

Существует также проблема в текущей реализации альтернативного синтаксического анализатора Spirit, поскольку он не выравнивает дерево выражений (хотя это двоичное дерево, обычно оно очень несбалансированное).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...