КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Пример 39
Наследование атрибутов в стеке синтаксического анализатора Удаление внедренных действий из схемы трансляции Восходящее вычисление наследуемых атрибутов. Все действия при восходящей трансляции должны находятся в правом конце продукции. Чтобы понять, каким образом наследуемые атрибуты могут обрабатываться снизу вверх, необходимо рассмотреть преобразование, по которому все вставленные действия в схеме трансляции располагаются в правых концах их продукций. Это преобразование вставляет в базовую грамматику новые нетерминалы- маркеры, порождающие λ, то есть каждое вставленное действие заменяется отдельным маркером М и добавляется действие в конец продукции М → λ. Например, схема трансляции Е → T R R → + Т {print( ' + ')} R | - Т {print( ‘ – ‘) } R | λ T → num { print( num .val) } преобразуется с помощью нетерминалов М и N в Е → T R R → +T M R | - T N R | λ Т → num { print(num.val)} М → λ{ print(' + ') } N → λ { print(‘ - ') } Грамматики в этих двух схемах трансляции задают один и тот же язык, и, построив дерево разбора с дополнительными узлами для действий, можно показать, что действия выполняются в одном и том же порядке. Действия в преобразованной схеме трансляции завершают продукции, так что они могут быть выполнены непосредственно перед сверткой правой части в процессе восходящего разбора.
Восходящий синтаксический анализатор сворачивает правую часть продукции А → ХY удалением X и Y с вершины стека синтаксического анализатора и заменой их на А. Предположим, что X имеет синтезируемый атрибут Х.s (который хранится в стеке вместе c Х). Поскольку значение Х.s находится в стеке перед выполнением любой свертки в поддереве ниже Y, это значение может быть наследовано Y. Таким образом, если наследуемый атрибут Y.i определен правилом копирования Y.i:=X.s, то значение Х.s может быть использовано там, где требуется Y.i. Правила копирования играют важную роль в вычислении наследуемых атрибутов в процессе восходящего синтаксического анализа.
Тип идентификатора может быть передан с помощью правил копирования и наследуемых атрибутов, как показано на рис. 60. Рассмотрим действия восходящего синтаксического анализатора при входной строке real р, q, r Значение атрибута Т.tуре можно получить при использовании продукции для L. Схема трансляции имеет следующий вид
Рис.60. L.in=T.type в каждом узле для L
Если проигнорировать действия в приведенной выше схеме трансляции, то последовательность шагов синтаксического анализатора при входном потоке real р, q, r будет иметь вид, представленный на рис.61. Для ясности вместо состояния стека здесь показан соответствующий символ грамматики, а вместо лексем id — соответствующие им идентификаторы. Предположим, что стек синтаксического анализатора реализован в виде пары массивов — state и val. Если state[i] — грамматический символ X, то в val[i] хранится синтезируемый атрибут X.s.
Рис. 61. При свертке правой части продукции для L, Т находится непосредственно под правой частью
Содержимое массива state показано на рис. 61. Всякий раз, когда сворачивается правая часть продукции L, в стеке непосредственно под правой частью располагается Т. Этот факт можно использовать для доступа к значению атрибута Т.type. Другая реализация (рис.62) использует информацию о местоположении Т.type в стеке val относительно его вершины. Пусть top и ntор указывают верхний элемент стека непосредственно перед сверткой и после нее.
Рис. 62. Значение T.type используется вместо L.in Из правил копирования, определяющих L.in, получаем, что вместо L.in можно использовать Т.type. При применении продукции L → id на вершине стека val находится id .entry, а непосредственно под ним — T.type. Следовательно, addtype(val[top], val[top-1]) эквивалентно addtype( id .entry, T.type). Аналогично, поскольку правая часть продукции L → L, id имеет три символа, T.type при ее свертке находится в val[top-3]. Правила копирования для атрибута L.in таким образом устраняются, поскольку вместо него используется значение T.type из стека.
Дата добавления: 2014-12-27; Просмотров: 474; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |