Какова производительность анализаторов на основе SPARK? - PullRequest
2 голосов
/ 05 апреля 2011

Парсеры на основе SPARK работают медленнее, чем парсеры на основе PLY, AFAIK.Но насколько медленнее?Подходят ли они для компиляторов промышленной прочности?Если вам есть что сказать о плюсах и минусах SPARK, я буду рад выслушать.

1 Ответ

4 голосов
/ 05 апреля 2011

Скорость этих синтаксических анализаторов в основном является свойством поддерживаемой ими грамматики. 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.

...