Языки и методы формальной спецификации (1158803), страница 14
Текст из файла (страница 14)
Если ни на одной ветви case_branch не было достигнуто успеха в сопоставлении тестового значения с соответствующими образцами, результирующим воздействием выражения case_expr является недетерминированный выбор между результирующими воздействиями в пустом множестве, т.е. swap.
6.23.5. While-выражения (While Expressions)
Синтаксис.
while_expr ::=
while logical-value_expr do unit-value_expr end
Контекстные условия. Максимальным типом первого выражения value_expr должен быть тип Bool.
Максимальным типом второго выражения value_expr должен быть тип Unit.
Атрибуты. Максимальным типом выражения while_expr является Unit.
Выражение while_expr статически обращается к тем переменным и каналам, к которым статически обращаются составляющие его выражения value_expr.
Семантика. Результирующее воздействие выражения while_expr состоит в том, чтобы повторять вычисление второго выражения value_expr, пока вычисление первого булевского выражения value_expr возвращает значение true. Значением, возвращаемым выражением while_expr, является Unit значение.
Имеет место следующая эквивалентность:
while value_expr1 do value_expr2 end
if value_expr1 then
value_expr2 ; while value_expr1 do value_expr2 end
else skip end
6.23.6. Until-выражения (Until Expressions)
Синтаксис.
until_expr ::=
do unit-value_expr until logical-value_expr end
Контекстно-независимые расширения. Выражение until_expr вида:
do value_expr1 until value_expr2 end
представляет собой краткую форму записи выражения:
value_expr1 ; while value_expr2 do value_expr1 end
6.23.7. For-выражения (For Expressions)
Синтаксис.
for_expr ::=
for list_limitation do unit-value_expr end
Контекстные условия. Максимальным типом выражения value_expr должен быть тип Unit.
Контекстно-зависимые расширения. Выражение for_expr вида:
for list_limitation do value_expr end
представляет собой краткую форму записи выражения:
let id = value_expr ½ list_limitation in skip end
-
Связывания (Bindings)
Синтаксис.
binding ::=
id_or_op ½
product_binding
product_binding ::=
( binding-list2 )
Терминология. Значение может быть сопоставлено со связыванием binding для получения некоторого набора определений значений.
Контекстные условия. Максимальный контекстный тип для связывания binding, представляющего собой операцию op, должен быть каким-либо функциональным типом, различимым с максимальным типом (типами) предопределенного значения (значений) операции op. Если операция op является инфиксной операцией infix_op, то типом параметра данного функционального типа должен быть тип декартова произведения длины 2.
Максимальным контекстным типом конструкции product_binding должен быть тип декартова произведения той же длины, что и список binding‑list2.
В конструкции product_binding составляющие ее связывания binding должны быть совместимы.
Атрибуты. Контекст связывания binding определяет максимальный контекстный тип для данного связывания binding. Для конструкций, содержащих в своем составе связывания binding, этот максимальный контекстный тип указывается в соответствующих разделах.
В качестве максимального типа конструкции id_or_op, представляющей собой связывание binding, принимается максимальный контекстный тип данного связывания binding.
В конструкции product_binding вида (binding1,…, bindingn) , контекстный тип которой имеет вид t1 ´ … ´ tn, максимальными контекстными типами связываний binding1,…, bindingn являются типы t1, …, tn соответственно.
Семантика. Совпадение некоторого значения v максимального контекстного типа t со связыванием binding вида id_or_op дает следующее определение:
id_or_op : t = v
Совпадение значения некоторого декартова произведения (v1,…,vn) максимального контекстного типа t1 ´ … ´ tn со связыванием product_binding вида (binding1,…, bindingn) дает набор определений, полученных при совпадении каждого значения vi максимального контекстного типа ti со связыванием bindingi.
-
Указания типа (Typings)
Синтаксис.
typing ::=
single_typing ½
multiple_typing
single_typing ::=
binding : type_expr
multiple_typing ::=
binding-list2 : type_expr
commented_typing ::=
opt-comment-string typing
Контекстно-независимые расширения. Все множественные указания типа multiple_typing и typing-list являются сокращенной формой для единичных указаний типа. Так, множественное указание типа multiple_typing вида:
binding1,…, bindingn : type_expr
является сокращенной формой следующей записи:
(binding1,…, bindingn) : type_expr ´ … ´ type_expr
где декартово произведение типов имеет длину n.
Список typing-list вида:
binding1 : type_expr1,…, bindingn : type_exprn
является сокращенной формой следующей записи:
(binding1,…, bindingn) : type_expr1 ´ … ´ type_exprn
Разложение на единичные указания типа списка typing-list, включающего множественные указания типа multiple_typing, начинается с разложения этих множественных указаний типа multiple_typing.
Атрибуты. Максимальным типом единичного указания типа single_typing является максимальный тип выражения type_expr.
В единичном указании типа single_typing максимальным контекстным типом содержащегося в ней связывания binding является максимальный тип соответствующего выражения type_expr.
Максимальное определение определения value_def, представляющего собой конструкцию commented_typing, получается путем замещения в составляющем ее указании типа typing типового выражения type_expr соответствующим выражением максимального типа.
Семантика. Единичное указание типа single_typing вида:
id_or_op : type_expr
представляет определение некоторого значения — id_or_op вводится для обозначения значения, тип которого представлен типовым выражением type_expr. Единичное указание типа single_typing вида:
(binding1,…, bindingn) : type_expr1 ´ … ´ type_exprn
представляет набор определений, представленных каждым единичным указанием типа:
binding1 : type_expr1
bindingn : type_exprn
-
Patterns (образцы)
9.1. Общие замечания
Синтаксис.
pattern ::=
value_literal
pure_value-name
wildcard_pattern
product_pattern
record_pattern
list_pattern
Терминология. Значение может сопоставляться с образцом pattern или внутренним образцом inner_pattern (см. раздел 9.8), и такое сопоставление может приводить к неудаче или успеху. В случае успеха результатом сопоставления является некоторый набор определений.
Для каждого вида образцов pattern и внутренних образцов inner_pattern задается свой критерий успешного сопоставления, а также результирующий набор определений для случая успешного сопоставления. Значение, которое сопоставляется с образцом pattern или внутренним образцом inner_pattern, называют ‘тестовым значением’.
Атрибуты. Контекст образца pattern или внутреннего образца inner_pattern определяет максимальный контекстный тип для данного образца pattern или внутреннего образца inner_pattern. Для каждой конструкции, содержащей в своем составе образцы pattern или внутренние образцы inner_pattern, этот максимальный контекстный тип указывается в соответствующих разделах.
Контекстно-зависимые расширения. Для образца pattern или внутреннего образца inner_pattern, представляющего собой литеральное значение value_literal, имя name, образец запись record_pattern или образец равенство equality_pattern, определено следующее контекстное условие: максимальный тип, ассоциируемый с этим образцом pattern или внутренним образцом inner_pattern, должен быть меньше или равен его максимального контекстного типа. Для этих образцов применяется неявное приведение типов. Неявное приведение типов представляет собой потенциальное приведение (см. раздел 5.1) максимального типа к максимальному контекстному типу. Если неявное приведение типов не является тождественной функцией, то соответствующий образец pattern или внутренний образец inner_pattern представляет собой сокращенную форму образца записи, полученного путем применения указанного неявного приведения типов:
-
Если неявное приведение типов является одной функцией f, то образец pattern или внутренний образец inner_pattern p представляет собой сокращенную форму образца записи record_pattern f(= p), если p является именем name, и f(p) в противном случае.
-
Если неявное приведение типов является композицией функций f1…fn (n 2), то образец pattern или внутренний образец inner_pattern p представляет собой сокращенную форму образца записи record_pattern f1(…(fn(= p))…), если p является именем name, и f1(…(fn(p))…) в противном случае.
Аналогичные приведения типов имеют место в выражениях value_expr (см. раздел 6.1).
9.2. Литеральные значения (Value Literals)
Контекстные условия. Для образца pattern или внутреннего образца inner_pattern, представляющего собой литеральное значение value_literal (см. раздел 6.2), максимальный тип этого литерального значения value_literal должен быть меньше или равен максимального контекстного типа указанного образца pattern или внутреннего образца inner_pattern.
Атрибуты. Максимальным типом литерального значения value_literal, представляющего собой некоторый образец pattern, является максимальный тип этого литерального значения value_literal.
Семантика.
-
Успешное сопоставление: литеральное значение value_literal должно быть равно тестовому значению.
-
Результирующие определения: нет.
9.3. Имена (Names)
Контекстные условия. Для образца pattern, представляющего собой имя name, это имя name должно представлять некоторое значение.
Максимальный тип этого имени name (см. раздел 10) должен быть меньше или равен максимального контекстного типа указанного образца pattern.
Семантика.
-
Успешное сопоставление: значение, представленное именем name, должно быть равно тестовому значению.
-
Результирующие определения: нет.
9.4. Универсальные образцы (Wildcard Patterns)
Синтаксис.
wildcard_pattern ::=
_
Семантика.
-
Успешное сопоставление: все значения успешно сопоставляются с универсальным образцом wildcard_pattern.
-
Результирующие определения: нет.
9.5. Образцы декартовы произведения (Product Patterns)
Синтаксис.
product_pattern ::=
( inner_pattern-list2 )
Контекстные условия. Максимальный контекстный тип образца декартово произведение product_pattern должен быть типом декартово произведение той же длины, что и список внутренних образцов inner_pattern-list2.
Составляющие данный образец внутренние образцы inner_pattern должны быть совместимы.
Атрибуты. В образце декартово произведение product_pattern вида (inner_pattern1,…, inner_patternn), максимальный контекстный тип которой имеет вид t1 ´ … ´ tn, максимальными контекстными типами внутренних образцов inner_pattern1,…, inner_patternn являются типы t1, …, tn соответственно.
Семантика.
-
Успешное сопоставление: пусть образец декартово произведение product_pattern имеет вид:
(inner_pattern1,…, inner_patternn)