Как определить, является ли грамматика 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 (пустое множество).