Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

9.5 Графы зависимости

Если атрибут b в узле дерева разбора зависит от атрибута с, то семантическое правило для b в этом узле должно выполняться после семантического правила, определяющего с. Зависимости между наследуемыми и синтезируемыми атрибутами в узлах дерева разбора могут быть показаны с помощью направленного графа, называемого графом зависимости.

Перед построением графа зависимости для дерева разбора каждое семантическое правило приводится к виду b:=f1, с2, …,сk) введением фиктивного синтезируемого атрибута b для каждого семантического правила, состоящего из вызова процедуры (или представляющего собой фрагмент кода). Граф имеет узел для каждого атрибута и дугу, ведущую в узел b из узла с, если атрибут b зависит от атрибута с.

Предположим, что продукция А XY имеет связанное с ней семантическое правило А.а:=f(Х.х, У.у). Это правило определяет синтезируемый атрибут А.а, который зависит от атри­бутов Х.х и Y.у. Если эта продукция используется в дереве разбора, то в графе зависимо­сти будет три узла А.а, Х.х и Yс дугами от Х.х к А.а, поскольку А.а зависит от Х.х, и от Yк А.а, поскольку А.а зависит от Y.у.

Если продукция А ХY имеет семантическое правило Х.і :=g(А.а, Y.у), связанное с ней, то в графе зависимости будут дуги от А.а к Х.і и Yк Х.і, поскольку Х.і зависит как от А. а, так и Y.у.

Пример 33

Когда в дереве разбора используется следующая продукция, мы добавляем показан­ные на рис. 53 дуги в граф зависимости.

Продукция Семантическое правило

E E1 * E2 E.val:=E1.val+ E2.val

Три узла, помеченные в графе зависимости символом •, представляют синтезируемые атри­буты Е.vаl, Е1.vаl и Е2.vаl в соответствующих узлах дерева разбора. Дуги, направленные от Е1.vаl, Е2.vаl к Е.vаl, показывают, что Е.vаl зависит от Е1.vаl, Е2.vаl. Пунктирные линии на рисунке представляют дерево разбора и не являются частью графа зависимости.

Рис. 53. Атрибут Е.val синтезирован из Е1.val и Е2.val

id3

Рис. 54. Граф зависимости для дерева разбора на рис. 43

Пример 34

На рис. 54 показан граф зависимости для дерева разбора на рис. 52. Узлы в графе зависимости помечены числами. Имеется дуга узла 4 для T.type в узел 5 L.in, поскольку наследуемый атрибут L.in зависит от атрибута T.type согласно семантическому правилу L.in := T.type для продукции D TL. Две нисходящие дуги в узлы 7 и 9 появляются в силу зависимости L1.in от L.in в соответствии с семантическим правилом L1.in := L.in для продукции L L1, id. Каждое из семантических правил addtype(id.entiy,L.in), связанных с L-продукциями, приводит к созданию фиктивного атрибута. Узлы 6, 8 и 10 построены для таких фиктивных атрибутов.

9.6 Порядок выполнения

Топологическая сортировка направленного ациклического графа является упорядочением узлов графа т1 , т2,… тk, таким, что дуги направлены от узлов, расположенных в упорядоченной последовательности раньше, к узлам, расположенным поэтапно т.е. если тi, тj — дуга от тi, к тj то тi, встречается в упорядоченной последовательности раньше тj.

Любая топологическая сортировка графа зависимости дает правильный порядок пополнения семантических правил, связанных с узлами дерева разбора, т.е. к моменту пополнения семантического правила b:=f1, с2, …,сk) атрибуты с12,…, ск доступны для вычисления f.

Трансляция, определяемая синтаксически управляемым определением, может быть уточнена. Вначале для построения дерева разбора входного потока используется грамматика, лежащая в основе синтаксически управляемого определения. Затем строится граф зависимости после топологической сортировки, которого, получается порядок выполнения семантических правил. Выполнение этих правил в полученном порядке приводит к трансляции входной строки.

Пример 35

Каждая из дуг графа зависимости на рис. 45 направлена от узла с меньшим номером к узлу с большим номером. Следовательно, топологическая сортировка графа зависимости может быть выполнена просто записью узлов в порядке их номеров. После такой топологической сортировки получим следующую программу (an означает атрибут, связанный с узлом номер п в графе зависимости).

а4 := real;

а5 := а4 ;

addtype (id3. entry, a5) ;

a7 := a5;

addtype (id2. en try, a7,);

a9 : = a7',

addtype (id1. entry, a9) ;

Выполнение этих семантических правил вносит тип real в записи таблицы символов для каждого из идентификаторов.

Для выполнения семантических правил существует ряд методов.

1. Методы дерева разбора. Порядок выполнения семантических правил определяется во время компиляции с помощью топологической сортировки графа зависимости построенного по дереву разбора для каждой входной строки. Эти методы не позволяют определить порядок выполнения только в том случае, когда граф зависимости для конкретного дерева разбора имеет цикл.

2. Методы, основанные на правилах. В процессе создания компилятора анализируются семантические правила, связанные с продукциями, либо вручную, с помощью специализированного инструментария. Порядок вычисления атрибутов, связанных с каждой продукцией, предопределяется в процессе разработки компилятора.

3. Игнорирующие методы. Выбор порядка выполнения происходит без рассмотрения семантических правил. Например, если трансляция происходит в процессе синтак­сического анализа, то порядок выполнения задается методом синтаксического ана­лиза, независимо от семантических правил. Игнорирующие методы ограничивают класс реализуемых синтаксически управляемых определений.

Методы, основанные на правилах, и игнорирующие методы не требуют явного построения графа зависимости в процессе компиляции, поэтому они более эффективными с точки зрения времени работы и используемой памяти.