it-roy-ru.com

Как определить, является ли грамматика LL (1), LR (0) или SLR (1)?

Как определить, является ли грамматика LL (1), LR (0) или SLR (1)?

Может кто-нибудь объяснить, используя этот пример или любой другой пример?

X → Yz |

Y → bZ | ε

Z → ε

59
Prashant Bhardwaj

Чтобы проверить, является ли грамматика LL (1), одним из вариантов является создание таблицы синтаксического анализа LL (1) и проверка на наличие конфликтов. Эти конфликты могут быть

  • ПЕРВЫЙ/ПЕРВЫЙ конфликты, где для нетерминальной/терминальной пары должно быть предсказано два разных производства.
  • ПЕРВАЯ/СЛЕДУЮЩАЯ конфликты, когда прогнозируются два разных производства, одно из которых представляет, что некоторое производство должно быть взято, и расширяется до ненулевого числа символов, а другое, представляющее, что производство должно использоваться, указывающее, что некоторое нетерминальное значение должно быть в конечном итоге расширено до пустой строки.
  • Конфликты FOLLOW/FOLLOW, в которых два произведения, указывающие на то, что нетерминал должен быть в конечном счете расширен до конфликта пустой строки друг с другом.

Давайте попробуем это на вашей грамматике, построив наборы FIRST и FOLLOW для каждого из нетерминалов. Здесь мы получаем, что

FIRST(X) = {a, b, z}
FIRST(Y) = {b, epsilon}
FIRST(Z) = {epsilon} 

У нас также есть, что следуют наборы

FOLLOW(X) = {$}
FOLLOW(Y) = {z}
FOLLOW(Z) = {z}

Из этого мы можем построить следующую таблицу синтаксического анализа LL (1):

    a    b    z   $
X   a    Yz   Yz  
Y        bZ   eps
Z             eps

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

Чтобы проверить, является ли грамматика LR (0) или SLR (1), мы начнем с создания всех наборов конфигурации LR (0) для грамматики. В этом случае, предполагая, что X является вашим начальным символом, мы получаем следующее:

(1)
X' -> .X
X -> .Yz
X -> .a
Y -> .
Y -> .bZ

(2)
X' -> X.

(3)
X -> Y.z

(4)
X -> Yz.

(5)
X -> a.

(6)
Y -> b.Z
Z -> .

(7)
Y -> bZ.

Отсюда видно, что грамматика не является LR (0), поскольку в состояниях (1) и (6) существуют конфликты сдвига/уменьшения. В частности, потому что у нас есть элементы сокращения Z →. и Y →., мы не можем сказать, уменьшать ли пустую строку до этих символов или сдвигать какой-либо другой символ. В более общем смысле, грамматика с ε-продукцией не является LR (0).

Тем не менее, эта грамматика может быть SLR (1). Чтобы увидеть это, мы дополняем каждое сокращение предустановкой для определенных нетерминалов. Это возвращает этот набор конфигурационных наборов SLR (1):

(1)
X' -> .X
X -> .Yz [$]
X -> .a  [$]
Y -> .   [z]
Y -> .bZ [z]

(2)
X' -> X.

(3)
X -> Y.z [$]

(4)
X -> Yz. [$]

(5)
X -> a.  [$]

(6)
Y -> b.Z [z]
Z -> .   [z]

(7)
Y -> bZ. [z]

Теперь у нас больше нет конфликтов с уменьшением сдвига. Конфликт в состоянии (1) был устранен, потому что мы уменьшаем его только тогда, когда обращаемся к z, что не конфликтует ни с одним из других элементов. Аналогично, конфликт в (6) исчез по той же причине.

Надеюсь это поможет!

95
templatetypedef

Если у вас нет конфликтов FIRST/FIRST и FIRST/FOLLOW, ваша грамматика LL (1).

Пример конфликта FIRST/FIRST:

S -> Xb | Yc
X -> a 
Y -> a 

Видя только первый входной символ a, вы не можете знать, применять ли производственный S -> Xb или S -> Yc, потому что a находится в ПЕРВОМ наборе как X, так и Y.

Пример конфликта FIRST/FOLLOW:

S -> AB 
A -> fe | epsilon 
B -> fg 

Видя только первый входной символ f, вы не можете решить, применять ли производственный A -> fe или A -> epsilon, потому что f находится как в первом наборе A, так и в следующем наборе A (A может быть проанализирован как epsilon и Б как е).

Заметьте, что если у вас нет epsilon-продукций, у вас не может возникнуть конфликт FIRST/FOLLOW.

10
Kent Munthe Caspersen

Простой ответ: грамматика называется LL (1), если связанная таблица синтаксического анализа LL (1) имеет не более одного произведения в каждой записи таблицы.

Take the simple grammar A -->Aa|b.[A is non-terminal & a,b are terminals]
   then find the First and follow sets A.
    First{A}={b}.
    Follow{A}={$,a}.

    Parsing table for Our grammar.Terminals as columns and Nonterminal S as a row element.

        a            b                   $
    --------------------------------------------
 S  |               A-->a                      |
    |               A-->Aa.                    |
    -------------------------------------------- 

Поскольку [S, b] содержит два произведения, возникает путаница относительно того, какое правило выбрать. Так что это не LL (1).

Несколько простых проверок, чтобы увидеть, является ли грамматика LL (1) или нет. Проверка 1: Грамматика не должна оставаться рекурсивной. Пример: E -> E + T. не является LL (1), потому что он является рекурсивным слева. Проверка 2: Грамматика должна быть оставлена ​​с учетом.

Левый факторинг необходим, когда два или более выбора правил грамматики имеют общую строку префикса. Пример: S -> A + int | A.

Проверка: Грамматика не должна быть неоднозначной.

These are some simple checks.
2
Anil Kumar

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

В ЛЛ (1)

  • Первый L означает сканирование ввода слева направо. Вторая буква L обозначает самый левый вывод. 1 означает использование одного входного символа на каждом шаге.

Для проверки грамматики LL (1) вы можете нарисовать таблицу интеллектуального анализа. И если вы найдете несколько записей в таблице, вы можете сказать, что грамматика не является LL (1).

Их также можно использовать для проверки, является ли грамматика LL (1) или нет. Техника быстрого доступа

1
Badal