Я знаю, что в грамматике существуют конфликты «первый/первый» и «первый/последующий», что делает грамматику «не LL(1)». Мне просто интересно, существует ли конфликт Follow/Follow в грамматике.
Может ли в грамматике существовать конфликт «следуй-следуй»?
Ответы (2)
Да, это возможно, но для этого требуется необычная конфигурация. Рассмотрим следующую грамматику, дополненную новым начальным символом:
S' S$
S тТ
Т А | Б
А
Б
Теперь давайте представим, что мы пытаемся заполнить нашу таблицу синтаксического анализа LL(1), которая показана здесь:
$ t
+----------+----------+
S' | | S' -> S$ |
+----------+----------+
S | | S -> tT |
+----------+----------+
T | T -> A | |
| T -> B | |
+----------+----------+
A | A -> e | |
+----------+----------+
B | B -> e | |
+----------+----------+
Обратите внимание, что в записи для (T, $) есть два элемента. И это имеет смысл: если у нас есть активный нетерминал T и мы видим $, мы знаем, что нам нужно выбрать продукцию, которая расширится до пустой строки. И у нас есть два разных способа сделать это: мы могли бы использовать TA или TB с конечной целью расширения каждого из этих нетерминалов до пустой строки. Это проблема - мы не можем предсказать, какой маршрут выбрать.
Что же это за конфликт? Это не может быть конфликт ПЕРВЫЙ/ПЕРВЫЙ, потому что ПЕРВЫЙ(A) = {} и ПЕРВЫЙ(B) = {}, поэтому ни A, ни B не имеют терминалов в своем первом наборе. По той же причине это не может быть конфликтом FIRST/FOLLOW.
Это означает, что это редкий конфликт FOLLOW/FOLLOW — мы знаем, что выберем продукцию, основываясь на том, что находится в наборах FOLLOW A и B, и все же они полностью идентичны друг другу, и поэтому синтаксический анализатор не может выбрать что делать дальше однозначно.
Это предварительно более простой пример
S → A a
A → B | C
B → ε
C → ε
Здесь, поскольку a
находится в FOLLOW
из B
и C
, на (A, a)
возникнет конфликт между A → B
и A → C
. Обратите внимание, что других конфликтов нет.