Описанный выше SLR(1)-подход используют не всю возможную информацию при выяснении того, возможна ли свертка. Именно, он отдельно проверяет, возможна ли свертка при данном состоянии стека S и отдельно -- возможна ли свертка по данному правилу при данном символе Next. Между тем эти проверки не являются независимыми: обе могут дать положительный ответ, но тем не менее свертка при стеке S и очередном символе Next невозможна. В LR(1)-подходе этот недостаток устраняется.
LR(1)-подход состоит вот в чем: все наши определения и утверждения модифицируются так, чтобы учесть, какой символ стоит справа от разворачиваемого нетерминала (другими словами, чему равен Next при свертке).
Пусть -- одно из правил грамматики, а
t -- некоторый терминал или спецсимвол EOI (который мы
домысливаем в конце входного слова). Определим множество
как множество всех слов,
которые являются содержимым стека непосредственно перед сверткой
U в K в ходе успешного LR-процесса, при условии
(в момент свертки).
Если отбросить у всех слов из их конец U, то получится множество всех слов, которые могут
появиться в правых выводах перед нетерминалом K, за которым
стоит символ t. Это множество (не зависящее от того, какое
из правил
для нетерминала K выбрано) мы
будем обозначать
.
14.4.1. Написать грамматику для порождения множеств
14.4.2. Как меняется определение ситуации?
14.4.3. Как изменится определение согласованности?
14.4.4. Каковы правила для индуктивного вычисления множества
ситуаций, согласованных с данным словом S?
(1) Если слово S согласовано с ситуацией, причем слово V начинается на букву J, то есть
, то слово SJ согласовано с ситуацией
.
Это правило полностью определяет все ситуации с непустой
левой половиной (то есть не начинающиеся с подчеркивания),
согласованные с SJ. Осталось определить, для каких
нетерминалов K и терминалов t слово SJ принадлежит
. Это делается по двум правилам:
(2) Если ситуациясогласована с SJ (согласно правилу (1)), а V начинается на нетерминал К, то SJ принадлежит
для всех терминалов s, которые могут начинать слова, выводимые из слова
(слово V без первой буквы K), а также для
, если из
выводится пустое слово.
(3) Если SJ входит в
для некоторых L и t, причем
-- правило грамматики и V начинается на нетерминал K, то SJ принадлежит
для всех терминалов s, которые могут начинать слова, выводимые из
, а также для
, если из
выводится пустое слово.
14.4.5. Дать определения конфликтов сдвиг/свертка и
свертка/свертка по аналогии с данными выше.
Если в есть ситуация, в которой справа от
подчеркивания ничего нет, а вторым членом пары является терминал
t, то говорят, что для пары
LR(1)-возможна свертка (по соответствующему правилу). Говорят,
что для пары
возникает LR(1)-конфликт типа сдвиг/свертка, если
возможны и сдвиг, и свертка. Говорят,
что для пары
возникает LR(1)-конфликт типа свертка/свертка, если есть несколько
правил, по которым возможна свертка.
Грамматика называется LR(1)-грамматикой, если в ней нет
LR(1)-конфликтов типа сдвиг/свертка и свертка/свертка ни для одной
пары
14.4.6. Построить алгоритм проверки выводимости слова в
LR(1)-грамматике.
Полезно (в частности, для LALR(1)-разбора, смотри ниже) понять, как связаны понятия LR(0) и LR(1)-согласованности.
14.4.7. Сформулировать и доказать соответствующее утверждение.
Замечание. Таким образом, функция
Теперь мы можем дать определение LALR(1)-грамматики. Пусть
фиксирована некоторая грамматика, S -- слово из
нетерминалов и терминалов, t -- некоторый терминал (или
EOI). Будем говорить, что для пары
LALR(1)-возможна свертка по
некоторому правилу, если существует другое слово
с
, причем для пары
LR(1)-возможна свертка по рассматриваемому правилу. Далее
определяются конфликты (естественным образом), и грамматика
называется LALR(1)-грамматикой, если конфликтов нет.
14.4.8. Доказать, что всякая SLR(1)-грамматика является
LALR(1)-грамматикой, а всякая LALR(1)-грамматика является
LR(1)-грамматикой.
14.4.9. Построить алгоритм проверки выводимости в
LALR(1)-грамматике, который хранит в стеке меньше информации,
чем соответствующий LR(1)-алгоритм.
14.4.10. Привести пример LALR(1)-грамматики, не являющейся
SLR(1)-грамматикой.
14.4.11. Привести пример LR(1)-грамматики, не являющейся
LALR(1)-грамматикой.
Общие замечания о разных методах разбора
width0pt