- •Цели лексического анализа:
- •Основные функции лексического анализатора:
- •Общие принципы построения лексических анализаторов
- •Конечные автоматы
- •Преобразования нка
- •Задачи синтаксич анализа:
- •Роль синтаксического анализатора
- •Контекстно-свободные грамматики
- •Стековая реализация пс-анализа
- •Грамматики предшествования
- •Алгоритм синтаксического анализа простого предшествования
- •Алгоритм синтаксического анализа приоритета операторов
- •Нерекурсивный предиктивный анализ
- •Множества first и follow
- •Внутреннее представление программы
- •Способы внутреннего представления программ.
- •Триады – многоадресный код с неявно именуемым результатом.
- •Алгоритм преобразования дерева вывода в дерево операций:
- •Ассемблерный код и машинные команды
- •Синтаксически управляемые определения
- •Вид синтаксически управляемого определения
- •Восходящее выполнение s-атрибутных определений
- •Синтезируемые атрибуты в стеке синтаксического анализатора
- •Наследование атрибутов в стеке синтаксического анализатора
- •Замена наследуемых атрибутов синтезируемыми
Синтаксически управляемые определения
Синтаксически управляемое определение представляет собой обобщение контекстно-свободной грамматики, в кот каждый грамматич символ имеет связанное множ-во атрибутов — синтезируемые и наследуемые атрибуты. Если рассматривать узел грамматич символа в дереве разбора как запись с полями для хранения информации, то атрибут соответствует имени поля.
Атрибут может представлять собой все, что угодно, — строку, число, тип, адрес памяти и т.д. Знач-е атрибута в узле дерева разбора определ-ся семантическими правилами, связанными с используемой в данном узле продукцией.
Значение синтезируемого атрибута в узле вычисляется по значениям атрибутов в дочерних по отношению к данному узлах.
Значения наследуемых атрибутов определяются значениями атрибутов соседних (т.е. узлов, дочерних по отношению к родительскому узлу данного) и родительского узлов.
Дерево разбора, показывающее значения атрибутов в каждом узле, называется аннотированным, а процесс вычисления значений атрибутов в узлах дерева— аннотированием дерева разбора.
Вид синтаксически управляемого определения
В синтаксически управляемом определении каждая продукция грамматики А → α имеет связанное с ней множество семантических правил вида
b:=f(с1, с2, …,сk), где f — функция, с1 с2,…,ск — атрибуты грамматических символов продукции, а b — синтезируемый атрибут символа А или наследуемый атрибут одного из грамматических символов правой части продукции.
В любом случае атрибут b зависит от атрибутов с1, с2, …,сk.
Атрибутная грамматика является синтаксически управляемым определением, в котором функции в семантических правилах не имеют побочных эффектов.
Функции в семантических правилах зачастую записываются как выражения. Иногда единственная цель семантического правила в синтаксически управляемом определении состоит именно в создании побочного эффекта. Такие семантические правила записываются как вызовы процедур или фрагменты программ. Их можно рассматривать как правила, определяющие значения фиктивных синтезируемых атрибутов нетерминала в левой части связанной продукции; фиктивный атрибут и знак присвоения : = при этом не указываются.
В синтаксически управляемом определении предполагается, что терминалы могут иметь только синтезируемые атрибуты, поскольку определение не дает никаких семантических правил для терминалов (обычно значения атрибутов терминалов предоставляются лексическим анализатором). Кроме того, если не оговорено особо, стартовый символ не имеет наследуемых атрибутов.
Синтезируемые атрибуты
Синтезируемые атрибуты часто используются на практике.
S-атрибутным определением называется синтаксически управляемое определение, использующее только синтезируемые атрибуты.
Дерево разбора для S-атрибутного определения всегда может быть аннотировано путем выполнения семантических правил для атрибутов в каждом узле снизу вверх, от листьев к корню.
Наследуемые атрибуты
Наследуемые атрибуты представляют собой атрибуты, значения которых в узле дерева разбора определяются атрибутами родительского и/или дочерних по отношению к родительскому узлов.
Наследуемые атрибуты удобны для выражения зависимости конструкций языка программирования от контекста, в котором они появляются. Например, наследуемые атрибуты используются для отслеживания, появляется ли идентификатор слева или справа от знака присвоения, чтобы определить, потребуется ли адрес или значение данного идентификатора. Хотя всегда можно переписать синтаксически управляемое определение таким образом, чтобы использовать только синтезируемые атрибуты, зачастую более естественно воспользоваться синтаксически управляемым определением с наследуемыми атрибутами.