Зарезервированные слова не должны использоваться в качестве описываемого идентификатора.
Примечание. Зарезервированные слова, отличающиеся только соответствующими строчными или прописными буквами, рассматриваются как одинаковые (см. 2.3). Идентификаторы некоторых атрибутов, стоящие после апострофа, совпадают с зарезервированными словами (DELTA, DIGITS и RANGE).
Допустимые замены символов
Для основных символов вертикальной черты, номера и кавычки допустимы следующие замены:
символ вертикальной черты (|) можно заменить восклицательным знаком (!) там, где он используется как ограничитель;
символ номера (#) в литерале с основанием можно заменить двоеточием (:) при условии, что в этом литерале заменяются оба символа номера;
символ кавычки (”), использованный как строковая скобка на обоих концах строкового литерала, можно заменить символом процента (%), если последовательность символов строкового литерала не содержит символа кавычки и если в этом литерале заменяются обе строковые скобки. Для представления символа процента внутри последовательности символов строкового литерала должна использоваться пара соседних символов процента, которые рассматриваются как один символ процента.
Эти замены не изменяют смысла программы.
Примечание. Рекомендуется, чтобы замена символов вертикальной черты, номера и кавычки была ограничена случаями, когда соответствующих графических символов нет на терминалах. Заметим, что вертикальная черта изображается на некоторых устройствах прерывистой линией, замена в этом случае не рекомендуется.
Правила для идентификаторов и числовых литералов таковы, что строчные и прописные буквы эквивалентны; эти лексемы могут быть записаны только символами основного набора. Если строковый литерал предопределенного типа STRING содержит символы не из основного набора, та же самая последовательность значений символов может быть получена катена- цией строковых литералов, содержащих символы основного набора, и символьных констант, описанных в предопределенных пакетах ASCII и ГОСТ. Таким образом, строковый литерал ”АБ Й ВГ” можно заменить на ”АБ” & ГОСТ .ДЕНЕЖНЫЙ—ЗНАК&”ВГ”, а строковый литерал ”ABcd” со строчными буквами можно заменить на ”AB”&ASCII. LC_C&ASCII.LC_D.
ОПИСАНИЯ И ТИПЫ
Эта глава описывает типы и правила описания констант, переменных и именованных чисел.
Описания
В языке определены некоторые сорта понятий, объявляемые явно и неявно описаниями.
К таким понятиям относятся, например, числовой литерал, объект, дискриминант, компонент записи, параметр цикла, исключение, тип, подтип, подпрограмма, пакет, заданный модуль, настраиваемый модуль, одиночный вход, семейство входов, формальный параметр (подпрограммы, входа, настраиваемой подпрограммы), формальный параметр настройки, именованный блок или цикл, помеченный оператор, а также операция (в частности, атрибут или литерал перечисления, см. 3.3.3).
Существует несколько форм описаний. Основное описание — это форма описания, определенная следующим образом:
основное_описание : : =
описание—объекта |. описание_числа
I описание—типа | описание—подтипа
I описание—подпрограммы | описание—пакета
I описание—задачи | описание—настройки
I описание—исключения | конкретизация_настройки
I описание—переименования | описание„субконстанты
Некоторые формы описания всегда являются (явно) частью основного описания, а именно: спецификация дискриминантов, описание компонентов, описание входов, спецификация параметров, описание параметров настройки и спецификации литералов перечисления. Спецификация параметра цикла — это конструкция, которая входит только в некоторые формы оператора цикла.
Остальные формы описания являются неявными: имя блока, имя цикла и метка оператора. Некоторые операции описываются неявно (см. 3.3.3).
Для каждой формы описания правила языка определяют некоторый участок текста, называемый областью действия описания (см. 8.2). Некоторые формы описания связывают с описанным понятием идентификатор. Внутри области действия, и только в ней, существуют места, где возможно использование идентификатора для связи его с описанным понятием; эти места определяются правилами видимости (см. 8.3). В таких местах идентификатор называется именем понятия (простым именем); говорят, что имя обозначает связанное с ним понятие.
Некоторые формы спецификации литерала перечисления связывают символьный литерал с соответствующим описываемым понятием. Некоторые фо)>мы описаний связывают символ операции или другие обозначения с явно или неявно описанной операцией.
Процесс, в результате которого описание вступает в силу, называется предвыполнением описания; этот процесс протекает во время выполнения программы.
Говорят, что после своего предвыполнения описание становится предвыполненным. До завершения своего предвыполнения (как и до его начала) описание считается еще не предвыполненным. Предвыполнение любого описания дает всегда по крайней мере один эффект: описание из еще не предвыполненного становится (меняет статус) предвыполненным. Фраза: „предвыполнение не дает другого эффекта” используется тогда, когда происходит только изменение статуса описания. Процесс предвыполнения определяется также для разделов описаний, элементов описания и компилируемых модулей (см. 3.9 и 10.5).
Описания объекта, числа, типа и подтипа даны в этой главе. Остальные основные описания изложены в последующих главах.
Примечание. Синтаксические правила используют термин идентификатор для первого вхождения идентификатора в Некоторую форму описания; термин простое имя используется для любого вхождения идентификатора, который уже обозначает какое- либо описанное понятие.
Объекты и именованные числа
Объект — это понятие языка. Объект имеет (содержит) значение данного типа. Объектом может быть:
Объект, объявленный описанием объекта или описанием одиночной задачи;
Формальный параметр подпрограммы, входа или настраиваемой подпрограммы;
Формальный объект настройки;
Параметр цикла;
Объект, указанный значением ссылочного типа;
Компонент или отрезок другого объекта.
Описание числа — это специальная форма описания объекта, которая связывает идентификатор со значением типа универсальный—целый или универсальный—вещественный.
описание_объекта : : =
список_идентификаторов : [constant] указание_подтипа [: = выражение] ;
I список идентификаторов : [constant] определение_ограниченного_индексируемого_типа [: =. выражение] ;
описание _числа : : =
список _ идентификаторов : constant
— универсальное _статическое-выражение;
список_идентификаторов : : =
идентификатор {, идентификатор}
Описание объекта называется единичным описанием объекта, если список его идентификаторов имеет единственный идентификатор; оно называется групповым описанием объектов, если его список имеет два или несколько идентификаторов. Групповое описание объектов эквивалентно последовательности соответствующего числа единичных описаний объектов. Для каждого идентификатора из списка в такой эквивалентной последовательности единичное описание объекта формируется из идентификатора, двоеточия и всего того, что стоит справа от двоеточия в групповом описании объекта; описания в эквивалентной последовательности идут в том же порядке, что и список идентификаторов.
Аналогичная эквивалентность имеет место также для списка идентификаторов описания числа, описаний компонентов, спецификаций дискриминантов, спецификаций параметров и описаний параметров настройки, исключений и субконстант.
В остальной части описания языка все пояснения даны для описаний с единственным идентификатором; соответствующие пояснения для описаний с несколькими идентификаторами следуют из эквивалентности, установленной выше.
Примеры:
- групповое описание объектов
ИВАН, ПЕТР: ИМЯ_ПЕРСОНЫ : = new ПЕРСОНА (ПОЛ => М) ;
- см. 3.8.1
- эквивалентно единичным описаниям объектов,
- следующим в данном порядке
ИВАН: ИМЯ „ПЕРСОНЫ: = new ПЕРСОНА (ПОЛ => М) ;
ПЕТР: ИМЯ_ПЕРСОНЫ: = new ПЕРСОНА (ПОЛ => М);
О п и с а н и я объектов
Описание объекта вводит объект, тип которого задан либо указанием подтипа, либо определением ограниченного индексируемого типа. Если описание объекта включает составной ограничитель присваивания, за которым следует выражение, то это выражение определяет начальное значение описываемого объекта; тип выражения должен совпадать с типом объекта.
Описываемый объект — константа, если в описании объекта присутствует зарезервированное слово constant. В этом случае описание должно включать явную инициализацию. Значение константы не может быть изменено после инициализации. Формальные параметры вида in подпрограмм и входов, а также формальные параметры настройки вида in являются константами; параметр цикла — константа в соответствующем цикле; подкомпонент или отрезок константы — тоже константа.
Объект, не являющийся константой, называется переменной (в частности, объект, заданный описанием объекта без зарезервированного слова constant, является переменной). Для изменения значения переменной существует только два пути: непосредственное присваивание или косвенное изменение (см. 6.2) оператором вызова процедуры или входа (это действие может быть выполнено над самой переменной, над компонентом переменной, либо над другой переменной, для которой данная является подкомпонентом) .
Предвыполнение описания объекта происходит следующим образом: а) устанавливается подтип объекта посредством предвыполнения указания подтипа или определения ограниченного индексируемого типа;
еслй описание объекта включает явную инициализацию, то его начальное значение получается вычислением соответствующего выражения. В противном случае вычисляются неявные начальные значения (если они есть) объекта или его подкомпонентов;
создается объект;
начальное значение (заданное явно или по умолчанию) присваивается объекту или соответствующему подкомпоненту.
Неявные начальные значения определяются для объектов, заданных описанием объекта, и для компонентов таких объектов в следующих случаях:
Для объекта ссылочного типа — его неявное начальное значение равно пустому значению ссылочного типа;
Для объекта заданного типа — неявное начальное (и единственное) значение обозначает соответствующую задачу;
. Если тип объекта является типом с дискриминантами и его подтип ограничен, то неявное начальное (и единственное) значение каждого дискриминанта определяется подтипом объекта;
Для объекта составного типа неявное начальное значение каждого компонента, имеющего выражение по умолчанию, получается вычислением этого выражения, если только компонент не дискриминант ограниченного объекта (предыдущий случай).
Если компонент сам является составным объектом, значение которого не определено ни явной инициализацией, ни выражением по умолчанию, то неявное начальное значение компонентов составного объекта определяется теми же самыми правилами, что и для описанного объекта.
Шаги от а до г выполняются в указанном порядке. Если на шаге б вычисляется выражение по умолчанию для дискриминанта, то это вычисление выполняется до вычисления выражений по умолчанию для зависящих от дискриминанта подкомпонентов, а также до вычисления выражений по умолчанию, содержащих имя дискриминанта. Кроме предыдущего правила, порядок вычисления выражений по умолчанию языком не определен.
При инициализации описанного объекта или одного из его подкомпонентов проверяется принадлежность начального значения подтипу объекта; для массива, объявленного описанием объекта, сначала применяется неявное преобразование подтипа, как при выполнении оператора присваивания, если только объект не является константой с подтипом неограниченного индексируемого типа. При отрицательном результате проверки возбуждается исключение 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). В приведенных выше примерах ПРЕДЕЛ и НИЖ- НИЙ_ПРЕДЕЛ инициализированы статическими выражениями, а ДОПУСК - нет, если ДИСПЕРСИЯ - определенная пользователем функция.
О п и с а н и е чисел
Описание числа - это специальная дополнительная форма описания константы. Тип статического выражения, заданного для инициализации в описании числа, должен быть либо типом универсальный _целый, либо типом универсальный-вещественный. Константа, объявленная описанием числа, называется именованным числом и имеет тот же тип, что и статическое выражение.