Я читаю книгу компилятора и отчасти смущенный, когда она говорит, что "S-атрибутной-грамматикой является также L-атрибутная-грамматика". Не мог понять. Может кто-то прояснять (пример должен быть ярким).Спасибо.
L-атрибутивные грамматики - это особый тип атрибутивных грамматик. Они позволяют оценивать атрибуты за один проход слева направо по абстрактному синтаксическому дереву. В результате, оценка атрибутов в L-атрибутных грамматиках может быть удобно включена в нисходящий синтаксический разбор. Многие языки программирования являются L-атрибутивными. Специальные типы компиляторов, узкие компиляторы, основаны на некоторой форме L-атрибутированной грамматики. Они сравнимы с S-атрибутированными грамматиками. Используются для синтеза кода.
S-атрибутивные грамматики - это класс атрибутивных грамматик, характеризующихся отсутствием наследуемых атрибутов. Наследуемые атрибуты, которые должны передаваться от родительских узлов к дочерним узлам абстрактного синтаксического дерева во время семантического анализа в процессе разбора, являются проблемой для синтаксического анализа снизу вверх, поскольку при синтаксическом анализе снизу вверх родительские узлы абстрактного синтаксического дерева создаются после создания всех их дочерних узлов. Оценка атрибутов в S-атрибутивных грамматиках может быть удобно включена как в нисходящий, так и в восходящий синтаксический разбор. Yacc основан на S-атрибутивном подходе.
Любая S-атрибутивная грамматика также является L-атрибутивной грамматикой.
В L-атрибутивных грамматиках оценка атрибутов может быть выполнена при обходе слева направо. Поскольку в S-атрибутивных грамматиках атрибуты не наследуются, это не мешает вам поступать именно так. Поэтому можно сказать, что S-атрибутивная грамматика соответствует этой характеристике L-грамматики.