LL, як правило, є більш ефективною методикою синтаксичного аналізу, ніж рекурсивний спуск. Насправді, наївний парсер з рекурсивним спуском насправді буде O (k ^ n) (де n - вхідний розмір) у гіршому випадку. Деякі методи, такі як запам'ятовування (що дає синтаксичний аналізатор Packrat ), можуть покращити це, а також розширити клас граматик, прийнятих синтаксичним аналізатором, але завжди є космічний компроміс. Синтаксичні аналізатори LL - це, наскільки мені відомо, завжди лінійний час.
З іншого боку, ви правильно розумієте, що парсери з рекурсивним спуском можуть обробляти граматики вищого класу, ніж LL. Рекурсивний спуск може обробляти будь-яку граматику, яка є LL (*) (тобто необмежений перегляд), а також невеликий набір неоднозначних граматик. Це пов’язано з тим, що рекурсивний спуск насправді є кодованою безпосередньо реалізацією ПЕГ або граматикою (-ами) вираження аналізатора . Зокрема, диз'юнктивний оператор ( a | b
) не є комутативним, тобто a | b
не рівний b | a
. Аналізатор рекурсивного спуску спробує кожну альтернативу по порядку. Так що, якщо a
відповідає входу, він буде succede навіть якщо b
б відповідав входу. Це допускає класичні двозначності "найдовшого збігу", як звисанняelse
вирішити проблему, просто впорядкувавши від’єднання.
Попри все сказане, можна реалізувати синтаксичний аналізатор LL (k), використовуючи рекурсивний спуск, щоб він працював у лінійний час. Це робиться шляхом по суті вбудовування наборів передбачень так, щоб кожна процедура аналізу визначала відповідне виробництво для даного входу за постійний час. На жаль, така техніка виключає обробку цілого класу граматик. Як тільки ми вступаємо в інтелектуальний аналіз, такі проблеми, як бовтанка else
, вже не вирішуються з такою легкістю.
Що стосується того, чому ЛЛ буде обрано замість рекурсивного спуску, це головним чином питання ефективності та ремонтопридатності. Синтаксичні аналізатори рекурсивного спуску набагато простіші в реалізації, але їх, як правило, важче підтримувати, оскільки граматика, яку вони представляють, не існує в жодній декларативній формі. У більшості нетривіальних випадків використання синтаксичного аналізатора використовується генератор синтаксичного аналізатора, такий як ANTLR або Bison. З такими інструментами насправді неважливо, чи алгоритм прямо кодується рекурсивним спуском або керується таблицею LL (k).
З інтересу також варто розглянути рекурсивне сходження , яке є алгоритмом синтаксичного аналізу, кодованим безпосередньо за модою рекурсивного спуску, але здатним обробляти будь-яку граматику LALR. Я також хотів би скористатися комбінаторами синтаксичного аналізатора , які є функціональним способом складання синтаксичних аналізаторів рекурсивного спуску.