Руководство по Ada (Ada 2022)
5.1 Простые и составные операторы - Последовательности операторов
Оператор является либо простым, либо составным. Простой оператор не содержит другие операторы. Составной оператор может содержать простые операторы и другие составные операторы. Конструкции параллельного исполнения вводят дополнительные логические потоки управления (см. Раздел 9), не создавая новую задачу. Параллельные циклы (см. 5.5) и операторы parallel_block_statement (см. 5.6.1) являются конструкциями параллельного исполнения.
Синтаксис
simple_statement ::= null_statement
| assignment_statement | exit_statement
| goto_statement | procedure_call_statement
| simple_return_statement | entry_call_statement
| requeue_statement | delay_statement
| abort_statement | raise_statement
| code_statement
| assignment_statement | exit_statement
| goto_statement | procedure_call_statement
| simple_return_statement | entry_call_statement
| requeue_statement | delay_statement
| abort_statement | raise_statement
| code_statement
compound_statement ::=
if_statement | case_statement
| loop_statement | block_statement
| extended_return_statement
| parallel_block_statement
| accept_statement | select_statement
if_statement | case_statement
| loop_statement | block_statement
| extended_return_statement
| parallel_block_statement
| accept_statement | select_statement
null_statement ::= null;
Имя direct_name statement_identifier должно быть идентификатором (а не операторным символом).
Правила разрешения имен
Имя direct_name statement_identifier должно соответствовать его неявному объявлению (см. ниже).
Правила допустимости
Разные идентификаторы должны использоваться для всех statement_identifier в одном теле, включая внутренние block_statement, но не включая внутренние программные модули.
Статическая семантика
Для каждого statement_identifier существует неявное объявление (с указанным идентификатором) в конце declarative_part самого внутреннего block_statement или тела, которое включает statement_identifier. Неявные объявления выполняются в том же порядке, что и statement_identifier в исходном коде. Если имя использования обозначает такое неявное объявление, то сущность, которую оно обозначает, является меткой, loop_statement или block_statement с заданным statement_identifier.
Если одна или несколько меток завершают sequence_of_statements, то неявный null_statement следует за метками перед любыми последующими конструкциями.
Динамическая семантика
Выполнение оператора null_statement не оказывает никакого эффекта.
Передача управления — это действие во время выполнения оператора exit_statement, оператора возврата, goto_statement или requeue_statement, выбор terminate_alternative, возбуждение исключения или прерывание, которые заставляют следующее действие быть отличным от того, что обычно ожидалось бы от других правил языка. Как объяснено в 7.6.1, передача управления может привести к завершению выполнения конструкций и их оставлению, что может вызвать финализацию.
Выполнение sequence_of_statements состоит из последовательного выполнения отдельных операторов statement до завершения sequence_.
Внутри конструкции параллельного исполнения, если передача управления из конструкции инициирована одним из логических потоков управления, делается попытка отменить все другие логические потоки управления, инициированные конструкцией параллельного исполнения. Как только все другие логические потоки управления конструкции либо завершат выполнение, либо будут отменены, происходит передача управления. Если два или более логических потока управления одной и той же конструкции одновременно инициируют такую передачу управления, один из них выбирается произвольно, а остальные отменяются.
Когда логический поток управления отменяется, отмена заставляет его завершить выполнение так, как будто он выполнил передачу управления в точку, где он закончил бы свое выполнение. Такая отмена откладывается, пока логический поток управления выполняется в операции с отложенным прерыванием (см. 9.8), и может быть отложена дальше, но не позже момента, когда логический поток управления инициирует новую вложенную конструкцию параллельного исполнения или достигает обработчика исключений, который находится за пределами такой операции с отложенным прерыванием.
Ограниченные (временно́й) ошибки
Во время выполнения конструкции параллельного исполнения является ошибкой вызова операции, которая потенциально блокирует (см. 9.5). Ошибка Program_Error возникает, если ошибка обнаружена реализацией; в противном случае выполнение потенциально блокирующей операции может либо продолжиться нормально, либо привести к неопределённой блокировке некоторых или всех логических потоков управления, составляющих текущую задачу.
END_OF_DOCUMENT_MARKER ПРИМЕЧАНИЕ A statement_identifier, который появляется непосредственно в области объявления именованного loop_statement или accept_statement, тем не менее, неявно объявляется непосредственно в области объявления самого внутреннего окружающего тела или block_statement; другими словами, расширенное имя именованной инструкции не зависит от того, находится ли инструкция внутри или вне именованного цикла или accept_statement — только вложенность внутри block_statements влияет на форму его расширенного имени.
Примеры
Примеры помеченных инструкций:
<<Here>> <<Ici>> <<Aqui>> <<Hier>> null;
<<After>> X := 1;