Скорость этих синтаксических анализаторов в основном является свойством поддерживаемой ими грамматики. SPARK поддерживает грамматики Earley, а PLY поддерживает грамматики LALR (1). Существует много информации о плюсах и минусах каждого стиля грамматики, поэтому я просто предоставлю краткий обзор здесь.
Самая большая разница между парсерами Earley и LALR заключается в том, как они справляются с перекрытием и неоднозначностью в грамматике.
Разбор LALR (k) является детерминированным. Он может справиться только с перекрытием в грамматике, которое может быть разрешено в пределах k токенов. Положительным моментом является то, что грамматики, совместимые с синтаксическими анализаторами LALR, имеют наихудшее время выполнения O (n).
Разбор Earley очень похож на более обычный анализ GLR. Они могут обрабатывать как неограниченный прогноз, так и неоднозначности, но они делают это, разбивая дерево разбора на несколько путей в каждой точке наложения или неоднозначности. Это может привести к гораздо большему количеству работы для синтаксического анализатора, и в результате синтаксический анализ Earley / GLR имеет наихудшее время выполнения O (n ^ 3).
То, что вы используете, зависит от того, что вы хотите сделать. Парсеры LALR лучше подходят для своей скорости, но парсеры Earley допускают гораздо более гибкие грамматики, чем парсеры LALR. Из-за неясностей в языке C ++ не может быть проанализирован синтаксическим анализатором LALR. Он требует парсера Earley / GLR и является примером того, почему вы хотели бы использовать парсер Earley / GLR вместо парсера LALR.