9.6.1 Те, кто осведомлен об АСН.1, знают, что присвоение типа может использоваться для создания новых имен (новых типов), например, из типов INTEGER и BOOLEAN. Новые имена определяют типы, которые будут теми же INTEGER или BOOLEAN, но несут другую семантику. Это понятие расширено в ECN, чтобы позволить создание (в присвоении класса - см. 16.1.1) новых имен (новых классов) для конструкторов, таких как #SEQUENCE. Новые имена определяют классы, которые выполняют такие же функции при структурировании кодовых последовательностей (например, при конкатенации), но должны иметь другие объекты кодирования, применяемые к ним. Новое имя класса, присвоенное некоторому старому классу, сохраняет определенные характеристики этого старого класса. Итак, присвоение, например, "#My-Sequence ::= #SEQUENCE" создает новое имя класса #My-Sequence, которое все еще является некоторым классом кодирования, относящимся к конкатенации компонентов. Мы говорим, что такие классы кодирования имеют одну и ту же категорию.
9.6.2 Если новый класс кодирования создан из существующего класса кодирования, то объекты кодирования как старого, так и нового классов кодирования могут появляться в одном наборе объектов кодирования.
9.6.3 Все предопределенные классы кодирования получаются от одного класса из небольшого числа простейших классов кодирования. Поэтому #SEQUENCE и #SET оба получены от класса #CONCATENATION, классы #INTEGER и #ENUMERATED получены от класса #INT, а классы для различных типов АСН.1 "цепочка знаков" все получены от класса #CHARS. Структура кодирования (например, неявно генерируемая из некоторого типа АСН.1) может содержать смесь разных классов, которые все получены из одного и того же простейшего класса и которые позволяют разные кодирования, применяемые, например, к #SEQUENCE и #SET.
9.6.4 Часто удобно вложить классы кодирования в категории, основанные на простейшем классе, из которого они получены. Поэтому мы говорим, что #INTEGER, #ENUMERATED и #INT (и любой класс, полученный из них в операторе присвоения класса, таком как "#My-int ::= #INT") находятся в категории "целочисленная". Имеются также группы категорий, которые содержат весьма различные классы, имеющие некоторые одинаковые характеристики. Поэтому любой класс, который может иметь абстрактные значения, прямо связанные с ним, и который, следовательно, вырабатывает биты при кодировании, будет находиться, можно сказать, в группе категорий "битовое поле". Поэтому все классы, которые находятся в категории "целочисленная", или "булева", или "цепочка знаков", относятся к группе категорий "битовое поле". Классы, которые ответственны за кодирования с группированием или повторением (например, классы в категории "альтернативы" или "повторение"), относятся к группе категорий "конструктор кодирования". Имеются также два класса, чьи объекты кодирования определяют процедуры, не относящиеся прямо к конструированию кодирования (#TRANSFORM и #OUTER): они считаются находящимися в группе категорий "процедура кодирования". Структуры кодирования определяются с помощью классов в группе категорий "битовое поле", которые комбинируются с классами из группы категорий "конструктор кодирования" вместе с классами из категорий "факультативные возможности" (представляют процедуры кодирования для разрешенных факультативных возможностей) и "тег" (представляют кодирование тегов). Все такие классы находятся в категории "структура кодирования", а также в группе категорий "битовое поле".
9.6.5 Для простейших классов категория присваивается прямо. Для классов, созданных в операторе присвоения класса кодирования, категория определяется с помощью нотации справа от символа "::=". Если эта нотация является определением структуры кодирования, то класс будет относиться как к категории "структура кодирования", так и к группе категорий "битовое поле". Если эта нотация является справочным именем простого класса, то категория нового класса будет такой же, как категория присвоенного класса.
9.6.6 Категориями класса кодирования (см. 16.1.3) являются:
- категория "альтернативы" (alternatives) (классы, которые получены путем присвоения класса из #ALTERNATIVES);
- категория "конкатенация" (concatenation) (классы, которые получены путем присвоения класса из #CONCATENATION);
- категория "повторение" (repetition) (классы, которые получены путем присвоения класса из #REPETITION);
- категория "факультативные возможности (опции)" (optionality) (классы, которые получены путем присвоения класса из #OPTIONAL);
- категория "тег" (tag) (классы, которые получены путем присвоения класса из #TAG);
- категории "булева" (boolean), "цепочка битов" (bitstring), "цепочка знаков" (characterstring), "целочисленная" (integer), "вырожденная" (null), "идентификатор объекта" (objectidentifier), "цепочка октетов" (octetstring), "открытый тип" (opentype), "pad" и "действительное число" (real) (категории для классов, которые получаются из соответствующих простейших классов);
- категория "структура кодирования" (encoding structure) (классы, генерируемые из определений типов АСН.1 или с помощью явного определения структуры кодирования).
9.6.7 Определены следующие группы категорий:
- "битовое поле" (bit-field) (классы, которые соответствуют реальным полям при кодировании, таким как поля в категории "целочисленная" или "булева", вместе с любым классом в категории "структура кодирования"). Классы в этой группе категорий называются также классами "битовое поле";
- "конструктор кодирования" (encoding constructor) (классы, которые находятся в категориях "альтернативы", "конкатенация" или "повторение"). Классы в этой группе категорий называются также классами "конструктор кодирования";
- "процедура кодирования" (encoding procedure) (классы, которые прямо не связаны с конструкторами АСН.1 и которым не могут быть присвоены новые имена - #OUTER, #TRANSFORM, #CONDITIONAL-INT, #CONDITIONAL-REPETITION). Классы в этой группе категорий называются также классами "процедуры кодирования".