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

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

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

X → Yz / a

Y → bZ / ε

Z → ε

5 ответов


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

  • первый/первый конфликты, где два различных производства должны быть предсказаны для нетерминальной / терминальной пары.
  • сначала/следуйте конфликтам, где предсказываются два разных производства, одно из которых представляет, что некоторое производство должно быть взято и расширено до ненулевого числа символов, а другое - что производство должно использоваться, указывая, что некоторые нетерминальные должны быть в конечном итоге расширены до пустой строки.
  • FOLLOW/FOLLOW conflicts, где два производства, указывающие, что нетерминал должен в конечном итоге быть расширен до пустого конфликта строк друг с другом.

давайте попробуем это на вашей грамматике, построив первый и последующие наборы для каждого из нетерминалов. Вот, мы получаем это

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

у нас также есть следующие наборы are

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 → ., мы не можем сказать, уменьшать ли пустую строку до этих символов или сдвигать какой-либо другой символ. В целом, нет грамматики с ε-продукции ЛР(0).

однако эта грамматика может быть SLR (1). Чтобы увидеть это, мы увеличиваем каждую редукцию набором lookahead для конкретных нетерминалов. Это возвращает этот набор конфигураций 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) был устранен, потому что мы уменьшаем только тогда, когда lookahead-z, который не конфликтует ни с одним из других элементов. Аналогично, конфликт в (6) исчез по той же причине.

надеюсь, что это помогает!


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

пример первого / первого конфликта:

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

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

пример первого / следующего конфликта:

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

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

обратите внимание, что если у вас нет epsilon-productions, вы не можете иметь конфликт FIRST/FOLLOW.


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

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: грамматика должна быть учтена.

левый факторинг требуется, когда два или более вариантов правил грамматики разделяют общую строку префикса. Пример: С-->A+int/A.

проверка 3:грамматика не должна быть двусмысленной.

These are some simple checks.

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

In LL (1)

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

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

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


с помощью этих двух шагов мы можем проверить, если это LL (1) или нет. Они оба должны быть удовлетворены.

1.Если у нас есть производство: A - >a1|a2|a3|a4/.....|-. Тогда сначала(a(i)) пересечение сначала(a(j)) должно быть phi (пустое множество)[a (i)-индекс i.]

2.Для каждого не терминала "A", если первый(A) содержит epsilon Затем сначала(a) пересечение следует(A) должно быть phi (пустое множество).