Подтвердить что ты не робот

Ограничения LL против LR-парсеров?

Я знаю основные отличия парсеров LL против LR. Я также знаю, что GLR, SLR и LALR являются все расширениями парсеров LR. Поэтому мой вопрос более подробно...

Учитывая синтаксический анализатор LL (*) и любую вариацию в LR-синтаксическом анализаторе, существует ли какой-либо язык, который может быть описан в одном, а не в другом? Или, проще говоря, есть какая-либо функция или свойство, которые не могут быть выражены ни с помощью?

Как конкретный пример. Если бы я должен был создать язык с использованием парсера LL (*), буду ли я когда-либо запускать желаемые функции/свойства, которые я могу добавить на свой язык, что было бы возможно только с помощью парсера LR (или наоборот)?

4b9b3361

Ответ 1

Конечно. Анализаторы LL не могут обрабатывать какие-либо грамматики с левой рекурсией. L (AL) R (k) для фиксированного k не смогут анализировать некоторые вещи, которые может обрабатывать парсер LL (*), поскольку k < *.

Ответ 3

Вам может быть интересен этот абзац в Википедии, в котором говорится, что грамматики LL (*) являются подмножествами грамматик LR (k): http://en.wikipedia.org/wiki/Context-free_grammar#Restrictions Таким образом, вы можете анализировать другие языки с использованием методов партирования LR.

Ответ 4

Есть несколько грамматик, которые нельзя "переписать" для анализа синтаксическими анализаторами LL, которые можно проанализировать с помощью парсеров LR. Один пример: учитывая простую грамматику, которая строит термины с субтракциями:

S -> S - S | num

У вас, очевидно, есть левая рекурсия, которая не может обрабатываться LL-парсерами. Чтобы сделать эту грамматику понятной LL, вы должны устранить левую рекурсию:

S -> num S'

S' -> - num S' | epsilon

Теперь ваш LL-парсер может обрабатывать эту грамматику. Но при создании вашего синтаксического дерева для слова типа 4 - 2 -1, поиск глубины на дереве даст вам 4 - (2 - 1) = 3 вместо (4 - 2) - 1 = 3 как и следовало ожидать.

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

Итак, здесь у вас есть класс языков, которые не могут обрабатываться LL.

Ответ 5

LR-парсер может принимать более широкий класс языков, чем LL. В LL (k) и LR (k) k означает количество символов заголовка, которое необходимо знать, чтобы оно могло применять соответствующее производство/сокращение. Чем больше k, тем больше разбор таблицы. Таким образом, k не ограничивает только LR-парсеров, это также ограничивает LL-парсеры. Причина, по которой LR-парсер может принимать более высокий класс языков, связана с левой рекурсией, которая является проблематичной при работе с парсерами LL. Но это не совсем так, потому что прямая рекурсия разрешима, что означает, что вы можете переписать грамматику как грамматику LL. Прямая рекурсия - это нечто вроде A → Abc. Когда у вас есть косвенная рекурсия, для которой вы теперь, вероятно, знаете, как она выглядит, тогда у вас есть проблема. Анализаторы LR могут решить эти проблемы, поскольку они создают дерево разбора снизу вверх. Вам нужно будет немного глубже проанализировать парсинг LR, чтобы понять, почему это точно. Но парсеры LR не все могучие, у них тоже есть ограничения. Некоторые грамматики очень трудно переварить, а коэффициент k не помогает. Для такого рода грамматик необходим анализатор GLR, который фактически имитирует парсер LR (k), но использует обратную трассировку для анализа всего пространства синтаксического анализа при возникновении двусмысленности производства/уменьшения.

Ответ 6

Разбор LL теоретически O (n ^ 4) или довольно медленный. Разбор LR быстрее, O (n ^ 3) или довольно медленный. https://en.wikipedia.org/wiki/Top-down_parsing

Хотя мне бы хотелось увидеть доказательство этого.