- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
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 рассмотрим другие альтернативы.
