Чтобы проверить, является ли грамматика LL (1), одним из вариантов является создание таблицы разбора LL (1) и проверка любых конфликтов. Этими конфликтами могут быть:
- ПЕРВЫЕ/ПЕРВЫЕ конфликты, в которых для нетерминальной/терминальной пары должно было быть предсказано два разных производства.
- FIRST/FOLLOW конфликты, в которых предсказываются две разные постановки, одна из которых означает, что необходимо произвести некоторую продукцию и расширить ее до ненулевого числа символов, а один из них означает, что следует использовать производство, указывающее на то, что некоторые нетерминалы должны быть в конечном счете расширены к пустой строке.
- Конфликты 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 →., мы не можем определить, следует ли уменьшить пустую строку до этих символов или сдвинуть какой-то другой символ. В более общем смысле, никакая грамматика с & epsilon -productions не является LR (0).
Однако эта грамматика может быть зеркальной (1). Чтобы убедиться в этом, мы увеличиваем каждое сокращение с помощью набора координат для конкретных нетерминалов. Это возвращает этот набор зеркальных (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) ушел по той же причине.
Надеюсь, это поможет!
Не существует ли ПЕРВЫЙ/ПЕРВЫЙ конфликт между X и Y в вашем обсуждении грамматики LL (1)? Оба они содержат b. –
@ JohnRoberts-FIRST/FIRST конфликт возникает, когда два произведения для одного и того же нетерминала имеют перекрывающиеся FIRST множества. Несмотря на то, что X и Y содержат b в своих FIRST-наборах, в грамматике не существует нетерминала с двумя постановками, одна из которых начинается с X, а одна из них начинается с Y. Имеет ли это смысл? – templatetypedef
Итак, вы говорите, что, поскольку две постановки связаны с разными нетерминалами, конфликта нет? –