ГЛАВА 2. БЛОКИ, ЛОКАЛИЗАЦИЯ И СФЕРА ДЕЙСТВИЯ Блоки состоят из объявлений, которые записаны и скомбинированы в любом порядке, и операторов. Каждый блок является частью объявления процедуры или функции, или частью программы или модуля. Все идентификаторы и метки, объявленные в разделе объявлений, являются локальными для блока. Синтаксис В общем виде любой блок имеет следующий формат: ┌──────────┐ ┌──────────┐ блок ────Ў│ раздел ├────Ў│ раздел ├────Ў │объявления│ │операторов│ └──────────┘ └──────────┘ раздел ──────────┬────────────────────────────────────┬───Ў объявления ° │ ° │ │ │ ┌──────────────────┐ │ │ │ ├───Ў│раздел объявления ├──────┤ │ │ │ │ меток │ │ │ │ │ └──────────────────┘ │ │ │ │ ┌──────────────────┐ │ │ │ ├───Ў│раздел объявления ├──────┤ │ │ │ │ констант │ │ │ │ │ └──────────────────┘ │ │ │ │ ┌──────────────────┐ │ │ │ ├───Ў│раздел объявления ├──────┤ │ │ │ │ типов │ │ │ │ │ └──────────────────┘ │ │ │ │ ┌──────────────────┐ │ │ │ ├───Ў│раздел объявления ├──────┤ │ │ │ │ переменных │ │ │ │ │ └──────────────────┘ │ │ │ │ ┌──────────────────┐ │ │ │ └───Ў│раздел объявления ├──────┘ │ │ │процедур и функций│ │ │ └──────────────────┘ │ └──────────────────────────────────────────┘ Раздел объявления меток - это та часть блока, где объявляются метки, присваеваемые оператором в соответствующем разделе операторов. Каждая метка должна помечать только один оператор. раздел ┌───────┐ ┌───────┐ ┌───┐ объявления ─────Ў│ label ├──────Ў│ метка ├──┬──Ў│ ; ├───Ў меток └───────┘ ° └───────┘ │ └───┘ │ ┌───┐ │ └───│ , │──────┘ └───┘ Используемая в качестве метки последовательность цифр должна находиться в диапазоне от 0 до 9999. Раздел объявления констант содержит объявления констант, локальных для этого блока. раздел ┌───────┐ ┌────────────┐ объявления ───Ў│ const ├────┬─Ў│ объявление ├───────────┬───Ў констант └───────┘ ° │ │ константы │ ° │ │ │ └────────────┘ │ │ │ │ ┌───────────────────┐ │ │ │ │ │объявленине типиро-│ │ │ │ └─Ў│ ванной константы ├─┘ │ │ └───────────────────┘ │ └──────────────────────────────┘ Раздел объявления типов включает объявления всех типов в блоке. раздел ┌───────┐ ┌────────────┐ объявления ───Ў│ type ├──────Ў│ объявление ├────┬───Ў типов └───────┘ ° │ типа │ │ │ └────────────┘ │ └──────────────────────┘ Раздел объявления переменных состоит из объявления переменных, локальных для этого блока. раздел ┌─────┐ ┌────────────┐ объявления ───Ў│ var ├──────Ў│ объявление ├────┬───Ў переменных └─────┘ ° │ переменной │ │ │ └────────────┘ │ └──────────────────────┘ Раздел объявления процедур и функций состоит из объявления процедур и функций, локальных для этого блока. раздел ┌────────────┐ объявления ─────────┬─Ў│ объявление ├─────┬────Ў процедур и ° │ │ процедуры │ ° │ функций │ │ └────────────┘ │ │ │ │ ┌────────────┐ │ │ │ └─Ў│ объявление ├──┘ │ │ │ функции │ │ │ └────────────┘ │ │ ┌────────────┐ │ ├────Ў│ объявление ├─────┤ │ │констрактора│ │ │ └────────────┘ │ │ ┌────────────┐ │ ├────Ў│ объявление ├─────┤ │ │дестрактора │ │ │ └────────────┘ │ └────────────────────────┘ Раздел операторов определяет операторы или алгоритмические действия, которые выполняются в блоке. раздел ┌───────────┐ операторов ─────Ў│ составной ├─────Ў │ оператор │ └───────────┘ Правила для сферы действия Наличие идентификатора или метки в объявлении означает определение идентификатора или метки. Каждый раз, когда идентификатор или метка встречаются в программе, они должны находиться в области действия этого объявления. Сфера действия идентификатора или метки распространяется от их объявления до конца текущего блока, включая все блоки, входящие в текущий блок; ниже приводится несколько исключений: - Переобъявление во вложенном блоке: допустим, что Exterior является блоком, в котором вложен другой блок Interior. Если Exterior и Interior имеют идентификаторы с одинаковым именем, например, J, то Interior имеет доступ только к идентификатору J, который в нем объявлен, и аналогично Exterior имеет доступ только к идентификатору J, объявление которого он содержит. - Положение объявления внутри блока: идентификаторы и метки нельзя использовать до тех пор, пока они не объявлены. Объявление идентификатора или метки должно предшествовать любому вхождению идентификатора или метки в тексте программы с одним исключением. Базовый тип указателя может быть идентификатором, который еще не объявлен. Однако в конечном итоге этот идентификатор должен быть объявлен в том же разделе объявления, где встречается этот тип указателя. - Переобъявление внутри блока: идентификатор или метка могут быть объявлены только один раз на внешнем уровне данного блока. Единственным исключением является случай, когда объявление указывается в списке полей записи. Идентификатор поля записи объявляется внутри типа записи и имеет смысл только в сочетании со ссылкой на переменную этого типа записи. Поэтому вы можете повторно объявить идентификатор поля (с таким же написанием) в том же самом блоке, но не на том же самом уровне в указанном типе записи. Однако идентификатор, который был ранее объявлен, может быть повторно определен как идентификатор поля в том же самом блоке. Сфера действия идентификатора компоненты объекта расширяется на этот тип объекта. См. Главу 3 для дальнейшего объяснения. Сфера действия интерфейса и стандартных идентификаторов. Программы и модули, содержащие предложения uses, имеют доступ к идентификаторам, объявленным в разделах интерфейса модулей, указанных в этих предложениях uses. Каждый модуль в предложении uses определяет свою область действия, которая охватывает остальные используемые модули и программу в целом. Первый модуль в предложении uses представляет самую внешнюю область действия, а последний модуль - самую внутреннюю. Это означает, что если два или более модулей содержат объявление одного и того же идентификатора, то при неуточненном обращении к этому идентификатору будет выбран тот вариант, который был описан в последнем модуле в предложении uses. Однако, вы можете выбрать любой экземпляр этого идентификатора, указав уточненный идентификатор. Идентификаторы предопределенных констант, типов, переменных, процедур и функций Turbo Pascal действуют, как если бы они были объявлены в блоке, охватывающем все используемые модули и программу в целом. В действительности эти стандартные обьекты определены в модуле System, который используется любой программой или модулем прежде любого модуля, указанного в предложении uses. Это означает, что любой модуль или программа могут переопределить стандартные идентификаторы, а обращение к ним может быть выполнено с помощью составного идентификатора, например, System.Integer или System.Writeln.