Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
23.03.2015
Размер:
884 Кб
Скачать

138 Глава 6

symtab=data type [etype: type] is create, enter.scope, leave_scope, add.id, lookup, depth

Описание

Таблица syrntab является некоторой таблицей символов, разработанной для использования а компиляторе с языка программирования с блочной струк­турой. Она предоставляет операции для входа в область действия и для выхода из нее, а также операции для добавления и поиска информации об идентифика­торах. Таблицы sybtab изменяемы.

Операции

create =•• proc ( ) returns (syrntab) etfects Возвращает некоторый новый пустой элемент syrntab, который

готов воспринимать информацию о самой внешней области действия. enter _scope = proc (s: syrntab)

modifies s

effects Модифицирует набор s так, что он подготовлен для восприятия информации о новой области действия.

leave_scope = proc (s: syrntab) signals (outermost _scope)

modifies s

etfects Если набор s установлен на сам^ю внешнюю область действия, то signals выдает outerrnost_scopc. В прогивном случае из набора s уда­ляется информация о самой внутренней области действия. Затем набор s позиционируется так, чтобы воспринимать информацию об области действия, которая непосредственно содержит удаленную область дей­ствия.

add_id = proc (s: syrntab, id: sti ing, info: etype)

signals (duplicate) modifies s

effects Если строка id уже определена в самой внутренней области дей­ствия в наборе s, то signals выдает duplicate. В противном случае к самой внутренней области действия набора s добавляется строка id с соот­ветствующей информацией info.

lookup == proc (s: syrntab, id: string) returns (etype)

signals (not .defined)

effects. Если строка id не определена ни в какой области действия на­бора s, то signals выдает not_defined. В противном случае возвращается информация, связанная с набором s. Если набор s определен в несколь­ких областях действия, выдается информация из самой внутренней области действия sthx областей действия. depth == proc (s: syrntab) returns (int)

effects Возвращает число областей действия в наборе s. end syrnlab

Рис. 6.11. Спецификация блочно-структурированной таблицы символов.

который выдает элементы стека от самого последнего элемента, помещенного в стек, до самого первого, или мы могли бы задать некоторую операцию fetch, которая возвращает 1-й элемент для i от 1 до числа элементов в стеке. Какой выбор лучше?

6.6. На рис. 6.11 задана некоторая спецификация абстракции блочно-структурированной таблицы символов, которая обеспечивает операции, хорошо подходящие для компилирования программ, написанных на блочно-структури­рованном языке. Реализуйте эту абстракцию и дайте инвариантное представление и функцию абстракции. (Указание: используйте стеки (см. упражнение 6.5) и карты (см. упражнение 5.5). Добавьте дополнительные операции для стека и карты, если необходимо, и задайте спецификации для любых таких добавленных операций.)

7. Использование языка Паскаль

В этой книге приводится некоторый метод программирования, основанный на абстракциях. До этой главы мы рассматривали три вида абстракций — процедуры, типы данных и итераторы, —• а для задания конкретных примеров использовали язык CLU. Однако важно не смешивать методы программирования с языком программирования, который используется для описания этих методов. Поэтому в этой главе мы рассмотрим, как можно было бы использовать наш подход для языка программирования Па­скаль.

Язык CLU был разработан специально для реализации наших методов, так что он содержит синтаксические элементы, соответ­ствующие каждому из трех видов абстракций. В языке Паскаль непосредственно не обеспечиваются ни абстракции данных или итераций, ни абстракции через параметризацию. Тем не менее при проектировании программ, которые будут реализовываться на языке Паскаль, все же можно с успехом применить эти абстрак­ции. Для этого при проектировании надо использовать преиму­щества тех методов построения программ, которые хорошо обе­спечивает язык Паскаль, и избежать таких методов, которые чрезмерно трудно реализовать. Однако нельзя допускать, чтобы язык программирования слишком влиял на проектирование про­граммы. Хорошие программисты на языке ассемблера давным-давно научились использовать все виды абстракций, которые не существуют в их языке программирования. Многие програм­мисты на языке Паскаль тоже это поняли.

В этой главе мы по очереди рассмотрим абстракции процедур, данных и итераций, а затем приведем пример их использования. Для реализации этих абстракций на языке Паскаль имеется несколько возможных способов. Они могут быть в общем виде разделены на методы, в которых объекты абстракций запоми­наются в стеке, и на методы, в которых объекты абстракций хра­нятся в неупорядоченном массиве. Методы, основанные на неупо­рядоченном массиве, дают большую гибкость за счет некоторой неэффективности. Здесь мы обсудим только один метод, осно­ванный на неупорядоченном массиве, а в гл. 15 рассмотрим другие альтернативы.

Соседние файлы в папке POSIBNIK