Есть ли способ различить грамматику LL (k) и LR (k)?

12

Я недавно изучал проектирование компиляторов. Я узнал о двух типах грамматики: один - это грамматика LL, а другой - грамматика LR.

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

Но есть ли способ, чтобы мы могли сказать, что данная грамматика - LL или LR?

дебютантка
источник
3
Как насчет использования канонических методов для генерации таблиц и L R ( k ) и проверки, содержат ли они конфликты? L L ( 1 ) и L R ( 1 ) обычно рассматриваются в любом стандартном учебнике по разбору; то L L ( K ) и L R ( K ) методы являются немного сложнее найти, но также хорошо известны. LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Алекс тен Бринк
@AlextenBrink Звучит так, как будто вы могли бы дать ответ! (С возвращением, вы пропустили!)
Рафаэль
Использование канонической техники для проверки правильности грамматики LL или LR, но это длинный путь. Я пытаюсь найти небольшой способ найти то, что нашел в книге «Компиляторы» Ахо-Лама-Сетхи-Уллмана.
Деб

Ответы:

11

LL(k)LR(k)LL(k)LR(k)и потому что мы можем генерировать таблицы для них (таблицы синтаксического анализа используются для анализа входных строк). Обратите внимание, что для этих двух классов наличие таблицы синтаксического анализа позволяет сразу проверить, есть ли грамматика в классах, потому что это так, если и только если таблицы не содержат ошибок. Кроме того, да, есть классы грамматик, которые мы можем эффективно анализировать, если у нас есть таблица синтаксического анализа, но для которых мы не можем сгенерировать таблицу, если она существует.

LL(1)LR(1)SLR(1)LL(k)LR(k)

LL(k)LR(k)LL(1)kLL(k)LR(k)или нет, которые выполняются за полиномиальное время (генерация таблицы является экспоненциальной). Подробности читайте в учебнике выше. Обратите внимание, что во многих случаях таблица имеет разумный размер, поэтому тестирование не требуется.

kkLL(k)LR(k)LR(k)kLL(c)ck( подробности см. здесь )

Алекс тен Бринк
источник
Вы случайно не знаете, где я могу найти подробности алгоритма полиномиального времени для тестирования, если язык LR (k) (кроме покупки учебника)?
user541686
2

Мы должны проверять только то, что грамматика - это LL, или нет, потому что каждая грамматика LL - это LR, то есть LL является правильным подмножеством LR. Таким образом, если грамматика - LL, то она должна быть LR, но каждый LR - не LL.

Грамматика G находится в LL тогда и только тогда, когда A-> C | D, должно выполняться следующее условие:

  1. First (C) и First (D) являются непересекающимися множествами.
  2. Если пусто в First (D), First (C) и Follow (A) являются непересекающимися множествами, также пусто в First (C).
дебютантка
источник