Я провел исследование скорости синтаксического анализатора LR между LRSTAR и YACC.
В 1989 году я сравнил таблицы синтаксического анализа матрицы, определенные в статье, «Оптимизация таблиц синтаксического анализа для переносных компиляторов» с таблицами синтаксического анализа YACC (структура гребенки).Это таблицы LR или LALR.Я обнаружил, что таблицы парсера матрицы обычно в два раза быстрее таблиц парсера гребенки.Это связано с тем, что количество нетерминальных переходов (действий goto) обычно примерно вдвое превышает количество терминальных переходов.Матричные таблицы имеют более быстрый нетерминальный переход.Однако в парсере происходит много других вещей, кроме переходов между состояниями, так что это может быть не узким местом.
В 2009 году я сравнил матричные лексерные таблицы с таблицами лексеров, сгенерированных гибким способом, а также с лексерами прямого кода, сгенерированными re2c.Я обнаружил, что таблицы матриц были примерно в два раза быстрее, чем таблицы, сгенерированные flex, и почти так же быстро, как код rexc lexer.Преимущество матричных таблиц состоит в том, что они компилируются намного быстрее, чем таблицы прямого кода, и они меньше.И наконец, если вы позволите матричным таблицам быть очень большими (без сжатия), они на самом деле могут быть быстрее, чем таблицы с прямым кодом (re2c).График, показывающий сравнение, см .: страница сравнения LRSTAR
Интерфейсы компилятора (без предварительной обработки), созданные с помощью LRSTAR, обрабатывают около 2 400 000 строк кода в секунду, и это включает в себя создание символатаблица и абстрактное синтаксическое дерево при разборе и лексировании.Созданные с помощью DFA лексеры обрабатывают 30 000 000 токенов в секунду.Есть еще одно преимущество для матричных лексеров, управляемых таблицами, при использовании DFA.Скелет лексера может быть переписан на ассемблере.Когда я делал это в 1986 году, скорость лексера в два раза превышала скорость версии кода С.
У меня нет большого опыта со скоростью парсера LL или скоростью парсера рекурсивного спуска.Сожалею.Если бы ANTLR мог генерировать код C ++, то я мог бы сделать тест скорости для его парсеров.