Описанный выше 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. Сформулировать и доказать соответствующее утверждение.
Замечание. Таким образом, функция в LR(1)-смысле является расширением функции в LR(0)-смысле: если во всех парах выбросить вторые члены.
Теперь мы можем дать определение 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