Зарезервированные слова не должны использоваться в качестве описы­ваемого идентификатора.

Примечание. Зарезервированные слова, отличающиеся только соответствующими строчными или прописными буквами, рассматриваются как одинаковые (см. 2.3). Идентификаторы некоторых атрибутов, стоящие после апострофа, совпадают с заре­зервированными словами (DELTA, DIGITS и RANGE).

  1. Допустимые замены символов

Для основных символов вертикальной черты, номера и кавычки допус­тимы следующие замены:

  • символ вертикальной черты (|) можно заменить восклицательным знаком (!) там, где он используется как ограничитель;

  • символ номера (#) в литерале с основанием можно заменить двоето­чием (:) при условии, что в этом литерале заменяются оба символа номера;

  • символ кавычки (”), использованный как строковая скобка на обо­их концах строкового литерала, можно заменить символом процента (%), если последовательность символов строкового литерала не содержит симво­ла кавычки и если в этом литерале заменяются обе строковые скобки. Для представления символа процента внутри последовательности символов строкового литерала должна использоваться пара соседних символов про­цента, которые рассматриваются как один символ процента.

Эти замены не изменяют смысла программы.

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

Правила для идентификаторов и числовых литералов таковы, что строч­ные и прописные буквы эквивалентны; эти лексемы могут быть записаны только символами основного набора. Если строковый литерал предопреде­ленного типа STRING содержит символы не из основного набора, та же са­мая последовательность значений символов может быть получена катена- цией строковых литералов, содержащих символы основного набора, и сим­вольных констант, описанных в предопределенных пакетах ASCII и ГОСТ. Таким образом, строковый литерал ”АБ Й ВГ” можно заменить на ”АБ” & ГОСТ .ДЕНЕЖНЫЙ—ЗНАК&”ВГ”, а строковый литерал ”ABcd” со строчны­ми буквами можно заменить на ”AB”&ASCII. LC_C&ASCII.LC_D.

  1. ОПИСАНИЯ И ТИПЫ

Эта глава описывает типы и правила описания констант, переменных и именованных чисел.

  1. Описания

В языке определены некоторые сорта понятий, объявляемые явно и не­явно описаниями.

К таким понятиям относятся, например, числовой литерал, объект, дис­криминант, компонент записи, параметр цикла, исключение, тип, подтип, подпрограмма, пакет, заданный модуль, настраиваемый модуль, одиноч­ный вход, семейство входов, формальный параметр (подпрограммы, вхо­да, настраиваемой подпрограммы), формальный параметр настройки, име­нованный блок или цикл, помеченный оператор, а также операция (в част­ности, атрибут или литерал перечисления, см. 3.3.3).

Существует несколько форм описаний. Основное описание — это форма описания, определенная следующим образом:

основное_описание : : =

описание—объекта |. описание_числа

I описание—типа | описание—подтипа

I описание—подпрограммы | описание—пакета

I описание—задачи | описание—настройки

I описание—исключения | конкретизация_настройки

I описание—переименования | описание„субконстанты

Некоторые формы описания всегда являются (явно) частью основного описания, а именно: спецификация дискриминантов, описание компонен­тов, описание входов, спецификация параметров, описание параметров на­стройки и спецификации литералов перечисления. Спецификация параметра цикла — это конструкция, которая входит только в некоторые формы опе­ратора цикла.

Остальные формы описания являются неявными: имя блока, имя цик­ла и метка оператора. Некоторые операции описываются неявно (см. 3.3.3).

Для каждой формы описания правила языка определяют некоторый участок текста, называемый областью действия описания (см. 8.2). Некото­рые формы описания связывают с описанным понятием идентификатор. Внутри области действия, и только в ней, существуют места, где возможно использование идентификатора для связи его с описанным понятием; эти места определяются правилами видимости (см. 8.3). В таких местах иден­тификатор называется именем понятия (простым именем); говорят, что имя обозначает связанное с ним понятие.

Некоторые формы спецификации литерала перечисления связывают символьный литерал с соответствующим описываемым понятием. Некото­рые фо)>мы описаний связывают символ операции или другие обозначения с явно или неявно описанной операцией.

Процесс, в результате которого описание вступает в силу, называется предвыполнением описания; этот процесс протекает во время выполнения программы.

Говорят, что после своего предвыполнения описание становится пред­выполненным. До завершения своего предвыполнения (как и до его нача­ла) описание считается еще не предвыполненным. Предвыполнение любого описания дает всегда по крайней мере один эффект: описание из еще не предвыполненного становится (меняет статус) предвыполненным. Фраза: „предвыполнение не дает другого эффекта” используется тогда, когда про­исходит только изменение статуса описания. Процесс предвыполнения оп­ределяется также для разделов описаний, элементов описания и компили­руемых модулей (см. 3.9 и 10.5).

Описания объекта, числа, типа и подтипа даны в этой главе. Остальные основные описания изложены в последующих главах.

Примечание. Синтаксические правила используют термин идентификатор для пер­вого вхождения идентификатора в Некоторую форму описания; термин простое имя используется для любого вхождения идентификатора, который уже обозначает какое- либо описанное понятие.

  1. Объекты и именованные числа

Объект — это понятие языка. Объект имеет (содержит) значение данно­го типа. Объектом может быть:

  • Объект, объявленный описанием объекта или описанием одиночной задачи;

  • Формальный параметр подпрограммы, входа или настраиваемой под­программы;

  • Формальный объект настройки;

  • Параметр цикла;

  • Объект, указанный значением ссылочного типа;

  • Компонент или отрезок другого объекта.

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

описание_объекта : : =

список_идентификаторов : [constant] указание_подтипа [: = выражение] ;

I список идентификаторов : [constant] определение_ограниченного_индексируемого_типа [: =. выражение] ;

описание _числа : : =

список _ идентификаторов : constant

  • универсальное _статическое-выражение;

список_идентификаторов : : =

идентификатор {, идентификатор}

Описание объекта называется единичным описанием объекта, если список его идентификаторов имеет единственный идентификатор; оно называется групповым описанием объектов, если его список имеет два или несколько идентификаторов. Групповое описание объектов эквива­лентно последовательности соответствующего числа единичных описаний объектов. Для каждого идентификатора из списка в такой эквивалентной последовательности единичное описание объекта формируется из идентифи­катора, двоеточия и всего того, что стоит справа от двоеточия в групповом описании объекта; описания в эквивалентной последовательности идут в том же порядке, что и список идентификаторов.

Аналогичная эквивалентность имеет место также для списка идентифи­каторов описания числа, описаний компонентов, спецификаций дискрими­нантов, спецификаций параметров и описаний параметров настройки, исклю­чений и субконстант.

В остальной части описания языка все пояснения даны для описаний с единственным идентификатором; соответствующие пояснения для описа­ний с несколькими идентификаторами следуют из эквивалентности, установленной выше.

Примеры:

  • - групповое описание объектов

ИВАН, ПЕТР: ИМЯ_ПЕРСОНЫ : = new ПЕРСОНА (ПОЛ => М) ;

  • - см. 3.8.1

  • - эквивалентно единичным описаниям объектов,

  • - следующим в данном порядке

ИВАН: ИМЯ „ПЕРСОНЫ: = new ПЕРСОНА (ПОЛ => М) ;

ПЕТР: ИМЯ_ПЕРСОНЫ: = new ПЕРСОНА (ПОЛ => М);

  1. О п и с а н и я объектов

Описание объекта вводит объект, тип которого задан либо указанием подтипа, либо определением ограниченного индексируемого типа. Если опи­сание объекта включает составной ограничитель присваивания, за которым следует выражение, то это выражение определяет начальное значение описы­ваемого объекта; тип выражения должен совпадать с типом объекта.

Описываемый объект — константа, если в описании объекта присутст­вует зарезервированное слово constant. В этом случае описание должно включать явную инициализацию. Значение константы не может быть изме­нено после инициализации. Формальные параметры вида in подпрограмм и входов, а также формальные параметры настройки вида in являются кон­стантами; параметр цикла — константа в соответствующем цикле; подком­понент или отрезок константы — тоже константа.

Объект, не являющийся константой, называется переменной (в частнос­ти, объект, заданный описанием объекта без зарезервированного слова cons­tant, является переменной). Для изменения значения переменной существу­ет только два пути: непосредственное присваивание или косвенное измене­ние (см. 6.2) оператором вызова процедуры или входа (это действие мо­жет быть выполнено над самой переменной, над компонентом переменной, либо над другой переменной, для которой данная является подкомпонен­том) .

Предвыполнение описания объекта происходит следующим образом: а) устанавливается подтип объекта посредством предвыполнения ука­зания подтипа или определения ограниченного индексируемого типа;

  1. еслй описание объекта включает явную инициализацию, то его на­чальное значение получается вычислением соответствующего выражения. В противном случае вычисляются неявные начальные значения (если они есть) объекта или его подкомпонентов;

  2. создается объект;

  3. начальное значение (заданное явно или по умолчанию) присваивает­ся объекту или соответствующему подкомпоненту.

Неявные начальные значения определяются для объектов, заданных описанием объекта, и для компонентов таких объектов в следующих слу­чаях:

  • Для объекта ссылочного типа — его неявное начальное значение равно пустому значению ссылочного типа;

  • Для объекта заданного типа — неявное начальное (и единственное) значение обозначает соответствующую задачу;

. Если тип объекта является типом с дискриминантами и его подтип ограничен, то неявное начальное (и единственное) значение каждого дис­криминанта определяется подтипом объекта;

  • Для объекта составного типа неявное начальное значение каждого компонента, имеющего выражение по умолчанию, получается вычислением этого выражения, если только компонент не дискриминант ограниченного объекта (предыдущий случай).

Если компонент сам является составным объектом, значение которого не определено ни явной инициализацией, ни выражением по умолчанию, то неявное начальное значение компонентов составного объекта определяется теми же самыми правилами, что и для описанного объекта.

Шаги от а до г выполняются в указанном порядке. Если на шаге б вы­числяется выражение по умолчанию для дискриминанта, то это вычисление выполняется до вычисления выражений по умолчанию для зависящих от дискриминанта подкомпонентов, а также до вычисления выражений по умолчанию, содержащих имя дискриминанта. Кроме предыдущего правила, порядок вычисления выражений по умолчанию языком не определен.

При инициализации описанного объекта или одного из его подкомпо­нентов проверяется принадлежность начального значения подтипу объекта; для массива, объявленного описанием объекта, сначала применяется неяв­ное преобразование подтипа, как при выполнении оператора присваивания, если только объект не является константой с подтипом неограниченного ин­дексируемого типа. При отрицательном результате проверки возбуждается исключение CONSTRAINT—ERROR.

Значение скалярной переменной после предвыполнения соответствую­щего описания объекта не определено, если начальное значение не было при­своено переменной при (явной или неявной) инициализации.

Если операнд преобразования типа или квалифицированного выраже­ния является составной переменной с неопределенными значениями скаляр­ных подкомпонентов, то значения соответствующих подкомпонентов ре­зультата неопределены. Выполнение программы ошибочно, если делается попытка вычислить скалярную переменную с неопределенным значением. Аналогично выполнение программы ошибочно, если делается попытка при­менить предопределенную операцию к составной переменной, имеющей ска­лярный подкомпонент с неопределенным значением.

Примеры описаний переменных:

СЧЕТ, СУММА: INTEGER;

РАЗМЕР: INTEGER range 0 . . 10_000 : = 0;

СОРТИРОВАН: BOOLEAN : = FALSE;

ТАБЛИЦА_ЦВЕТОВ: array (1 . . К) of ЦВЕТ;

РЕЖИМ: ВЕКТОР_БИТ (1 . . 10) : = (others => TRUE);

Примеры описаний констант:

ПРЕДЕЛ : constant INTEGER : = 10_000;

НИЖНИЙ-ПРЕДЕЛ: constant INTEGER : = ПРЕДЕЛ/10;

ДОПУСК : constant ВЕЩЕСТВ : = ДИСПЕРСИЯ (1.15);

Примечание. Выражение для инициализации константы не обязательно является статическим выражением (см. 4.9). В приведенных выше примерах ПРЕДЕЛ и НИЖ- НИЙ_ПРЕДЕЛ инициализированы статическими выражениями, а ДОПУСК - нет, если ДИСПЕРСИЯ - определенная пользователем функция.

  1. О п и с а н и е чисел

Описание числа - это специальная дополнительная форма описания кон­станты. Тип статического выражения, заданного для инициализации в опи­сании числа, должен быть либо типом универсальный _целый, либо типом универсальный-вещественный. Константа, объявленная описанием числа, называется именованным числом и имеет тот же тип, что и статическое вы­ражение.