Откройте актуальную версию документа прямо сейчас
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.
Приложение F
(обязательное)
Правила
совместимости типов и значений
Приложение должно использоваться главным образом разработчиками с целью гарантировать, что они идентично интерпретируют язык. Оно приведено, чтобы четко специфицировать, что допустимо в АСН.1, а что - нет, и позволить специфицировать точное значение, которое идентифицирует какое-либо имя ссылки на значение, и точное множество значений, которое идентифицирует какое-либо имя ссылки на множество типов или значений. Приложение не устанавливает определения допустимых преобразований нотаций АСН.1 для каких-либо целей, отличных от указанных выше.
F.1 Необходимость понятия "отображение значений" (введение)
F.1.1 Рассмотрим следующие определения АСН.1:
A : : = INTEGER
B : : = [1] INTEGER
C : : = [2] INTEGER (0.. 6, ...)
D : : = [2] INTEGER (0.. 6, ..., 7)
E : : = INTEGER (7.. 20)
F : : = INTEGER {red (0), white (1), blue (2), green (3), purple (4)}
a A : : = 3
b B : : = 4
c C : : = 5
d D : : = 6
e E : : = 7
f F : : = green
F.1.2 Ясно, что ссылки на значения а, b, с, d, e, f могут быть использованы в нотациях значений, управляемых A, B, C, D, E, F соответственно. Например:
W : : = SEQUENCE {w1 A DEFAULT a}
x A : : = a
Y : : = A (1 .. a)
где все записи допустимы при определениях, данных в F.1.1. Однако если заменить А на В, С, D, E или F, то будут ли получившиеся предложения допустимыми? Аналогично, если ссылку на значение а заменить ссылкой b, c, d, e или f, то будут ли получившиеся предложения допустимыми?
F.1.3 Более сложный вопрос возник бы в случае замены ссылки на тип явным текстом правой части присваивания. Например:
f INTEGER {red (0), white (1), blue (2), green (3), purple (4)} : : =
green
W : : = SEQUENCE {
w1 INTEGER {red (0), white (1), blue (2), green (3), purple (4)}
DEFAULT f }
x INTEGER {red (0), white (1), blue (2), green (3), purple (4)} : : = f
Y : : = INTEGER {red (0), white (1), blue (2), green (3), purple (4)}
(1 .. f)
Допустимо ли это в АСН.1?
F.1.4 Некоторые из приведенных выше примеров таковы, что даже если и являются допустимыми (а большинство из них допустимы - см. ниже), то пользователям не следовало бы писать аналогичные тексты, как как они мало понятны и вводят в заблуждение. Однако часто встречается использование ссылки на значение некоторого типа (не обязательно INTEGER), как на значение по умолчанию для этого типа с применением тегирования или образования подтипа в управляющем типе. Понятие "отображение значений" вводится для того, чтобы обеспечить ясный и точный смысл определения, какие из приведенных выше конструкций допустимы.
F.1.5 Рассмотрим определения
C : : = [2] INTEGER (0 .. 6, ... )
E : : = INTEGER (7 .. 20)
F : : = INTEGER {red (0), white (1), blue (2), green (3), purple (4)}
В каждом случае создается новый тип. Для F можно четко идентифицировать соответствие 1-1 между значениями в этом типе и значениями в универсальном типе INTEGER. Для С и Е можно четко идентифицировать соответствие 1-1 между значениями в этих типах и подмножествами значений в универсальном типе INTEGER. Это взаимоотношение называется отображением значений между значениями в двух типах. Более того, так как значения в С, Е и F имеют отображения 1-1 в значения INTEGER, можно использовать эти отображения для обеспечения отображений между значениями самих С, Е и F. Для С и F это показано на рисунке F.1.
F.1.6 Пусть имеется ссылка на значение, такая как
с С : : = 5
на значение в С, которая должна в некотором контексте идентифицировать значение в F. Тогда, при условии, что существует отображения значений между этим значением в С и (единственным) значением в F, можно определить C как допустимую ссылку на значение в F. Это показано на рисунке F.2, где ссылка на значение С используется для идентификации значения в F и может использоваться вместо непосредственной ссылки f1, которую, в противном случае, нужно было бы определить:
f1 F : : = 5
"Рисунок F.1"
"Рисунок F.2"
F.1.7 Следует учитывать, что в некоторых случаях в одном типе имеются значения (например 7-20 в А, см. F.1.1), которые имеют отображения в значения в другом типе (например 7-20 в Е, см. F.1.1), а другие значения (например равные или больше 21 в А, см. F.1.1) таких отображений не имеют. Ссылка на такое значение в А не даст допустимой ссылки на значение в Е. (В данном примере весь тип Е имеет отображение значений в подмножество А. В общем случае, в обоих типах могут быть подмножества значений, имеющих отображения, и подмножества значений без отображений).
F.1.8 В стандартах АСН.1 используется текст на естественном языке для спецификации допустимости в приведенных выше и аналогичных случаях. В F.6 даны точные требования для допустимости, к которым следует обращаться при затруднениях со сложными конструкциями.
Примечание - То обстоятельство, что определено отображение значений между двумя конструкциями "Туре", позволяет использовать ссылки на значения, установленные с использованием одной конструкции "Туре", для идентификации значений в другой конструкции "Туре", которая достаточно похожа на первую. Это позволяет типизировать пустые и фактические параметры, используя текстуально разные конструкции "Туре" без нарушения правил совместимости пустых и фактических параметров. Кроме того, это позволяет специфицировать поля классов информационных объектов, используя одну конструкцию "Туре", а соответствующие значения в информационном объекте - используя другую конструкцию "Туре", которая достаточно похожа на первую. (Эти примеры не являются исчерпывающими). Рекомендуется, чтобы преимущества, предоставляемые этой свободой, использовались в таких простых случаях, как "SEQUENCE OF INTEGER" или "CHOICE {int INTEGER, id OBJECT IDENTIFIER}", а не в более сложных конструкциях "Туре".
F.2 Отображения значений
F.2.1 Лежащей в основе моделью являются типы, такие как неперекрывающиеся контейнеры, в которых находятся значения, и конструкция АСН.1 "Туре", каждое появление которой определяет новый, отличный от других, тип (см. рисунки F.1 и F.2). В настоящем приложении устанавливается, когда между такими типами существует отображение значений, позволяющее использовать ссылку на значение одного типа, когда нужна ссылка на значение некоторого другого.
Пример. Рассмотрим
X : : = INTEGER
Y : : = INTEGER
где Х и Y - имена ссылок на два разных типа (указатели), но между этими типами существует отображение значений, так что любая ссылка на значение Х может использоваться там, где управляет Y (например после DEFAULT).
F.2.2 На множестве всех возможных значений АСН.1 отображение значений относится к паре значений. Все множество отображений значений является математическим отношением. Это отношение обладает следующими свойствами: оно рефлексивно (каждое значение АСН.1 отображается само на себя), симметрично (если, по определению, существует отображение значения х1 в значение х2, то существует и отображение значения х2 в х1) и транзитивно (если существуют отображения значения х1 в х2 и х2 в х3, то существует и отображение значения х1 в х3).
F.2.3 Для любых двух данных типов Х1 и Х2, рассматриваемых как множества значений, множество отображений значений из Х1 в Х2 является отношением один к одному, т. е. для всех значений х1 из Х1 и x2 из Х2, если существует отображение значения х1 в х2, то:
а) нет отображения значения х1 в значение из Х2, отличное от х2, и
б) нет отображения значения из Х1 (отличного от х1) в значение х2.
F.2.4 Когда существует отображение значений между значениями х1 и х2, ссылка на любое из этих значений автоматически может использоваться для ссылки на другое значение, если это требуется некоторым управляющим типом.
Примечание - Определение отображений между значениями некоторых конструкций "Туре" предназначено только для обеспечения гибкости при использовании нотации АСН.1. Существование таких отображений не имеет никакого отношения к тому, что эти два типа несут одну и ту же прикладную семантику, но рекомендуется, чтобы конструкции АСН.1, которые были бы недопустимы без отображения значений, использовались только в тех случаях, когда соответствующие типы действительно выражают одну и ту же прикладную семантику. Часто отображения значения будут существовать в больших спецификациях между типами, которые являются идентичными конструкциями АСН.1, но несут совершенно разную прикладную семантику, и существование таких отображений никогда не должно использоваться при определении допустимости всей спецификации.
F.3 Определения идентичных типов
F.3.1 Понятие "определения идентичных типов" используется для того, чтобы было возможно определить отображения значений между двумя экземплярами "Туре", которые либо идентичны, либо достаточно похожи для использования в качестве взаимозаменяемых. Для определения точного смысла выражения "достаточно похожи" в настоящем разделе специфицирован ряд преобразований, которые применяются к каждому из экземпляров "Туре" для приведения их к нормальной форме. Два экземпляра "Туре" являются определениями идентичных типов только в том случае, когда их нормальные формы являются идентично упорядоченными списками одних и тех же элементов АСН.1 (см. раздел 11).
F.3.2 Каждый экземпляр "Туре" в спецификации АСН.1 является упорядоченным списком элементов, определенных в разделе 11. Нормальная форма получается путем применения преобразований, определенных в F.3.2.1 - F.3.2.4 в указанном порядке.
F.3.2.1 Удаляются все комментарии (см. 11.6).
F.3.2.2 Следующие преобразования не являются рекурсивными и, следовательно, должны применяться только один раз в произвольном порядке.
а) Для каждого целочисленного типа: "NamedNumberList" (см. 18.1), если он есть, переупорядочивается так, чтобы "identifier" были расположены в алфавитном порядке.
б) Для каждого перечислимого типа: к каждому "EnumerationItem" (см. 19.1), который не есть "identifier" (без номера), добавляется номер, как установлено в 19.3; затем "RootEnumeration" переупорядочивается так, чтобы "identifier" были расположены в алфавитном порядке.
в) Для каждого типа "битовая строка" : "NamedBitList" (см. 21.1), если он есть, переупорядочивается так, чтобы "identifier" были расположены в алфавитном порядке.
г) Для каждого значения идентификатора объекта: каждый "ObjIdComponent" преобразуется в соответствующую ему "NumberForm" согласно семантике раздела 31 (см. пример в 31.11).
д) Для типов "последовательность" (см. раздел 24) и "множество" (cм. раздел 26): любое расширение вида "ExtensionAndException" или "ExtensionAdditions" вырезается и помещается в конец "ComponentTypeLists"; "OptionalExtensionMarker", если он есть, удаляется.
Когда "TagDefault" есть "IMPLICIT TAGS", то к каждому экземпляру "Tag" добавляется ключевое слово "IMPLICIT TAGS" (см. раздел 30), если только не выполнено одно из следующих условий:
- оно уже есть, или
- присутствует ключевое слово EXPLICIT, или
- тегируемый тип есть CHOICE, или
- это открытый тип.
Когда "TagDefault" есть "AUTOMATIC TAGS", то решение о применении автоматического тегирования принимается в соответствии с 24.2 (автоматическое тегирование будет осуществляться позже).
Примечание - 24.3 и 26.2 устанавливают, что присутствие элемента "Tag" в "ComponentType", который будет вставлен в результате замены "COMPONENTS OF Tуре", само по себе не предотвращает преобразования автоматического тегирования.
Когда "ExtensionDefault" есть "EXTENSIBILITY IMPLIED", то после "ComponentTypeLists" добавляется многоточие ("..."), если его не было.
е) Для выборочного типа (см. раздел 28): "RootAlternativeTypeList" переупорядочивается так, чтобы идентификаторы в "NamedType" были расположены в алфавитном порядке. Когда "TagDefault" есть "IMPLICIT TAGS", то к каждому экземпляру "Tag" добавляется ключевое слово "IMPLICIT TAGS" (см. раздел 30), если только не выполнено одно из следующих условий:
- оно уже есть, или
- присутствует ключевое слово EXPLICIT, или
- тегируемый тип есть СHOICE, или
- это открытый тип.
Когда "TagDefault" есть "AUTOMATIC TAGS", то решение о применении автоматического тегирования принимается в соответствии с 24.2 (автоматическое тегирование будет осуществляться позже). Когда "ExtensionDefault" есть "EXTENSIBILITY IMPLIED", то после "AlternativeTypeLists" добавляется многоточие, если его не было.
F.3.2.3 Следующие преобразования должны применяться рекурсивно в указанном порядке до достижения неизменного состояния.
а) Для каждого значения идентификатора объекта (см. 31.3): если определение значения начинается с "DefinedValue", то "DefinedValue" заменяется ее определением.
б) Для типов "последовательность" и "множество": все экземпляры "COMPONENTS OF Type" (см. раздел 24) преобразуются в соответствии с разделами 24 и 26.
в) Для выборочных типов, типов "последовательность" и "множество": если ранее было принято решение о применении автоматического тегирования [см. F.3.2.2, перечисления д) и е)], то оно осуществляется в соответствии с разделами 24, 26 и 28.
г) Для селективного типа: конструкция заменяется выбранной альтернативной в соответствии с разделом 29.
д) Все ссылки на типы заменяются их определениями по следующим правилам:
- если замещающий тип является ссылкой на тип, являющийся преобразованным, то ссылка на тип заменяется специальным элементом, которому не соответствует никакой другой, кроме его самого;
- если замещающий тип является типом "последовательность-из" или "множество-из", то ограничения, следующие за замещаемым типом, если они есть, помещаются перед ключевым словом "OF";
- если замещаемый тип является параметризованным типом или множеством параметризованных значений (см. ИСО/МЭК 8824-4, 8.2), то каждый элемент "DummyReference" заменяется соответствующим "ActualParameter".
е) Все ссылки на значения заменяются их определениями; если замещаемое значение является параметризованным (см. ИСО/МЭК 8824-4, 8.2), то каждый элемент "DummyReference" заменяется соответствующим "ActualParameter".
Примечание - До замены любой ссылки на значение должны быть применены процедуры настоящего приложения для того, чтобы гарантировать, что ссылка на значение идентифицирует, непосредственно или через отображения значений, значение ее управляющего типа.
F.3.2.4 Для типа "множество": "RootComponentTypeList" переупорядочивается так, чтобы "ComponentType" были расположены в алфавитном порядке (от "а" до "z").
Примечание - В 11.9 (bstring), 11.10 (hstring) и 11.11 (cstring) установлено, что новые строки и пропуски в таких элементах значения не имеют. Если два экземпляра таких элементов содержат различающиеся использования новых строк и пропусков, то для целей F.3.3 они трактуются как идентичные.
F.3.3 Если два экземпляра "Туре", преобразованные к нормальной форме, являются идентичными списками элементов АСН.1 (см. раздел 11), то они называются определениями идентичных типов за следующим исключением: если "objectclassreference" (см. ГОСТ Р ИСО/МЭК 8824-2, 7.1) встречается в какой-либо нормальной форме "Туре", то эти два экземпляра не являются определениями идентичных типов и между ними не существует отображения значений (см. F.4 ниже).
Примечание - Это исключение введено для предотвращения необходимости введения правил преобразования к нормальной форме для элементов синтаксиса, относящихся к нотации информационных объектов, их классов и множеств. Аналогично, не определена нормализация для нотации всех значений и нотации арифметической установки. После доказательства требований для таких спецификаций, они могут быть включены в последующие версии стандарта. Понятия определений идентичных типов и отображений значений введены для обеспечения того, что простые конструкции АСН.1 могут быть использованы либо через имена ссылок, либо копированием текста. Нет необходимости обеспечивать эту возможность для более сложных экземпляров "Туре", содержащих классы информационных объектов и пр.
F.4 Спецификация отображения значений
F.4.1 Если два экземпляра "Туре" являются определениями идентичных типов по правилам F.3, то существуют отображения между всеми значениями одного типа и соответствующими значениями другого.
F.4.2 Для типа Х1, созданного тегированием из некоторого типа Х2 (см. раздел 30), отображения значений существуют по определению между всеми членами Х1 и соответствующими членами Х2.
Примечание - Хотя отображения значений по определению существуют между значениями Х1 и Х2 из F.4.2 и между значениями Х3 и Х4 из F.4.3, если такие типы встроены в идентичные в других отношениях, но разные определения типов (таких как определения типов SEQUENCE или CHOICE), получающиеся определения типов (SEQUENCE или CHOICE) не будут определениями идентичных типов и между ними не существуют отображения значений.
F.4.3 Для типа Х3, созданного из некоторого управляющего типа Х4 выбором значений, конструкцией множества элементов или образованием подтипа, отображения значений существуют по определению между членами нового типа и теми членами управляющего типа, которые были выбраны конструкцией множества элементов или подтипа. Присутствие или отсутствие маркера расширения не влияет на это правило.
F.4.4 B F.5 определены дополнительные отображения значений между некоторыми типами символьных строк.
F.4.5 Отображение значений существует между всеми значениями некоторого типа, определенного как целочисленный тип с поименованными значениями, и любого целочисленного типа, определенного без поименованных значений, с другими поименованными значениями, с другими именами поименованных значений или с другими поименованными значениями и именами одновременно.
Примечание - Существование отображения значений не влияет на требования правила области действия имен и поименованных значений. Они могут использоваться только в области действия, управляемой типом, в котором они определены, или ссылкой на имя этого типа.
F.4.6 Отображение значений существует по определению между всеми значениями любого типа, определенного как битовая строка с поименованными битами, и любого типа, определенного как битовая строка без поименованных битов, с другими поименованными битами, с другими именами поименованных битов или с другими поименованными битами и менами одновременно.
Примечание - Существование отображения значений не влияет на требования правила области действия имен и поименованных битов. Они могут использоваться только в области действия, управляемой типом, в котором они определены, или ссылкой на имя этого типа.
F.5 Дополнительные отображения значений, определенные для типов символьных строк
F.5.1 Имеется две группы ограниченных типов символьных строк: группа А (F.5.2) и В (F.5.3). По определению, отображения значений существуют между всеми типами в группе А и ссылки на их значения могут использоваться, когда они управляются одним из этих типов. Отображения значений никогда не существуют между разными типами в группе В или между какими-либо типами из групп А и В.
F.5.2 Группа А состоит из:
UTF8String
NumericString
PrintableString
lA5String
VisibleString (ISO646String)
UniversalString
BMPString
F.5.3 Группа B состоит из:
TeletexString (T61String)
VideotexString
GraphicString
GeneralString
F.5.4 Отображения значений в группе А определяются отображением значений символьных строк каждого типа в UniversalString и использованием свойства транзитивности отображений значений. Для отображения значений одного из типов группы А в UniversalString строка заменяется на UniversalString той же длины и с отображением каждого символа так, как описано ниже.
F.5.5 Формально множество абстрактных значений UTF8String то же самое, что и множество абстрактных значений UniversalString, но с другим тегом (см. 36.13), и каждое абстрактное значение UTF8String по определению отображается в соответствующее абстрактное значение UniversalString.
F.5.6 Глифы (формы печатных символов), используемые для типов NumericString и PrintableString, распознаются и недвусмысленно отображаются в подмножество глифов, присвоенных первым 128 символам ИСО/ МЭК 10646-1. Отображение для этих типов определяется через отображение глифов.
F.5.7 lA5String и VisibleString отображаются в UniversalString путем отображения каждого символа в символ UniversalString, который имеет (32-битовое) значение в кодировании BER для UniversalString идентичное (8-битовому) значению в кодировании BER для lA5String и VisibleString.
F.5.8 BMPString формально является подмножеством UniversalString, и соответствующие абстрактные значения имеют отображения значений.
F.6 Специфичные для типов и значений требования совместимости
В данном разделе понятие отображения значений используется для точной формулировки допустимости некоторых конструкций АСН.1.
F.6.1 Любое появление "Value" в х-нотации с управляющим типом Y идентифицирует у-значение в управляющем типе Y, которое имеет отображение в х-значении, заданное х-нотацией. Требуется, чтобы такое значение существовало.
Например рассмотрим появление х в последней строке следующей записи:
Х : : = [0] INTEGER (0 .. 30)
x X : : = 29
Y : : = [1] INTEGER (25 .. 35)
Z1 : : = Y (x | 30)
Эти конструкции АСН.1 допустимы и в последнем присваивании х-нотации х являются указанием х значения 29 в Х и, через отображение значения, идентифицирует у-значение 29 в Y. х-нотация 30 является указанием на у-значение 30 в Y и Z1 является множеством значений 29 и 30. С другой стороны, присваивание
Z2 : : = Y (x | 20)
недопустимо, так как нет у-значения, на которое может указывать х-нотация 20.
F.6.2 Любое появление "Туре" в t-нотации, которое имеет управляющий тип V, идентифицирует все множество значений в управляющем типе V, которые имеют отображения значений в любые значения в "Туре" t-нотации. Требуется, чтобы это множество содержало по крайней мере одно значение.
Например рассмотрим появление W в последней строке следующей записи:
V : : = [0] INTEGER (0 .. 30)
W : : = [1] INTEGER (25 .. 35)
Y : : = [2] INTEGER (31 .. 35)
Z1 : : = V (W | 24)
W привносит значения 25-30 в арифметическое множество, приводя к Z1, имеющему значения 24-30. С другой стороны, присваивание
Z2 : : = V (Y | 24)
недопустимо, так как нет значений в Y, которые отображались в значение в V.
F.6.3 Требуется, чтобы тип любого значения, подставленного в качестве фактического параметра, имел отображение из этого значения в одно из значений в типе, управляющем пустым параметром, и идентифицируется именно это значение в управляющем типе.
F.6.4 Если "Туре" подставлен в качестве фактического для пустого параметра, который является пустым параметром множества значений, требуется, чтобы все значения этого "Туре" имели отображения в значения в управляющем типе пустого параметра множества значений. Фактический параметр выбирает в управляющем типе полное множество значений, которые имеют отображения в "Туре".
F.6.5 При спецификации типа А пустой параметр, который является параметром значения или множества значений, допустим только в том случае, если для всех значений А и для всех использований А в правой части присваивания эти значения А могут быть использованы вместо пустого параметра.
F.7 Примеры
F.7.2 Пример 1
X : : = SEQUENCE X1 : : = SEQUENCE
{name VisibleString, {name VisibleString,
age INTEGER} - - комментарий - -
age INTEGER}
X2 : : = [8] SEQUENCE X3 : : = SEQUENCE
{name VisibleString, {name VisibleString,
age INTEGER} age AgeType}
AgeType : : = INTEGER
Х, Х1, Х2 и Х3 являются определениями идентичных типов. Ни различие в пропусках и комментариях, ни использование ссылки на тип "AgeType" в Х3 значения не имеют. Однако если изменить любой идентификатор элемента последовательности, то они перестанут быть идентичными определениями и между ними не будет отображения значений.
F.7.3 Пример 2
В : : = SET B1 : : = SET
{name VisibleString, {age INTEGER,
age INTEGER} name VisibleString}
Это определения идентичных типов при условии, что они не находятся в модуле, в заголовке которого стоит "AUTOMATIC TAGS"; в противном случае они не являются определения идентичных типов и между ними не существуют отображения значений. Аналогичные примеры могут быть написаны для CHOICE и ENUMERATED (используя форму "identifier" для "EnumerationItem").
F.7.4 Пример 3
C : : = SET C1 : : = SET
{name [0] VisibleString, {name VisibleString,
age INTEGER} age INTEGER (1 .. 64)}
Это не определения идентичных типов, и ни одно из них не является определением идентичного типа с В или В1; также нет отображений значений между С и С1 или между этими типами и В или В1.
F.7.5 Пример 4
x INTEGER { Y (2)} : : = 3
z INTEGER : : = х
Это допустимо, и присваивается значение 3 через отображение, определенное в F.4.5.
F.7.6 Пример 5
b1 BIT STRING : : = '101'B
b2 BIT STRING {version1 (0), version2 (1), version3 (2)} : : = b1
Это допустимо и b2 присваивается значение {version1, version3}.
F.7.7 Пример 6
С определениями из F.1.1 элементы SEQUENCE вида
X DEFAULT y
допустимы, где Х - любой из А, В, С, D, E, F или любой текст справа от присваивания типов этим именам, у - любой из а, b, c, d, e или f, за следующими исключениями: E DEFAULT у недопустимо для всех а, b, c, d, f и С DEFAULT е недопустимо, так как в этих случаях нет отображений значений из ссылки на значение по умолчанию на тип, для которого умолчание устанавливается.
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.