                             ГЛАВА 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.

