Поделиться через


Типы данных шаблона массива

Типы данных ARRAY состоят из одного или нескольких значений, которые имеют один и тот же тип данных. Массивы можно определить как фиксированную, переменную или неопределенную длину.

*DataType: ARRAY направляет шаблон для определения составного типа данных, члены которого имеют один и тот же тип данных (также известный как тип данных членов). Элементы типа данных массива будут выводиться в виде отдельных дочерних элементов XML, принадлежащих элементу, представляющего включающий контекст.

Если каждый дочерний элемент представляет тип данных-примитив, тип данных будет определяться XML-атрибутом xsi:type в каждом элементе. Если атрибут GDL определен как тип данных ARRAY, включающий контекст будет элементом <GDL_ATTRIBUTE> . Имя каждого дочернего xml-элемента будет соответствующим тегом, который определяет директива *ElementTags . Если объект COMPOSITE сам является членом другого составного типа данных, будет создан элемент для представления этого включающего контекста. Имя этого родительского элемента будет соответствующим тегом, назначенным шаблоном, определяющим включающий составной тип данных.

Для определения типа данных ARRAY используются следующие директивы:

  • *ElementType (обязательный). Имя шаблона, определяющего тип данных всех элементов. Можно указать только один тип данных.

  • *RequiredDelimiter (обязательно). Строка, которая синтаксически отделяет каждый элемент массива от следующего. Два последовательных разделителя будут интерпретироваться как опущенный элемент. Разделители не требуются для указания пропусков конечных элементов. Будьте внимательны, если пробел используется в качестве разделителя или как часть строки разделителя. Например, средство синтаксического анализа интерпретирует лишние пробелы как указывающие на опущенные элементы; а так как такие лишние пробелы могут не отображаться, могут возникнуть непредвиденные ошибки синтаксического анализа.

    Кроме того, из исходного файла обычно удаляются лишние пробелы, а пробелы часто добавляются во входной поток в результате обработки препроцессора, макроса и комментариев. Таким образом, фактически анализируемая строка может иметь совершенно другое количество символов пробела, чем указано изначально.

    Символы табуляции не следует использовать в обязательной строке разделителя, так как они регулярно преобразуются в пробелы во время обработки входных данных.

  • *OptionalDelimiter (необязательный). Любая строка, состоящая из символов, указанных в *OptionalDelimiter и расположенных рядом со строкой *RequiredDelimiter , будет считаться частью разделителя. Первый символ, определенный в строке *RequiredDelimiter , не должен отображаться в *OptionalDelimiter.

  • *ElementTags (обязательно). Если вы хотите назначить каждому элементу массива одно и то же имя элемента (или массив может иметь неограниченный размер), укажите только один тег. В противном случае укажите число, равное максимальному значению, заданному *ArraySize .

    Каждому элементу массива будет присвоено имя с соответствующим тегом. Такое именование полезно, если один или несколько элементов массива опущены. Если элементы массива опущены, тег, соответствующий опущенным элементу, не используется. Чтобы избежать путаницы с клиентом, не используйте GDL snapshot зарезервированных имен элементов (т. е. CONSTRUCT, ATTRIBUTE и Personality) в качестве имен тегов.

  • *ArraySize (обязательно). Используйте одно целое число, чтобы указать размер массива фиксированного размера, или два целых числа, чтобы указать минимальный и максимальный допустимый размер для массива переменной. Обратите внимание, что для минимального размера допускается ноль, а для указания размера или максимального размера можно использовать подстановочный знак GPD (*). Укажите пропущенные значения в данных экземпляра с помощью последовательных запятых (например, *DaysOfWeek: (Sunday, Monday, , Wednesday, , Friday,).

  • *ArrayLabel (необязательно). Если указана эта директива, список элементов массива должен быть заключен в круглые скобки и предваряться меткой *ArrayLabel . Если в этой директиве не указана метка, круглые скобки являются необязательными, а метка предварительного добавления не допускается.

Рассмотрим следующий шаблон.

*Template:  RECTANGLE
{
    *Type:  DATATYPE
    *DataType:   ARRAY
    *ElementType:  INTEGER
    *RequiredDelimiter: ","
    *OptionalDelimiter: "<20 09>"
    *ArrayLabel: "rect"
    *ElementTags: (left, top, right, bottom)
    *ArraySize: 4
}

Этот шаблон определяет массив фиксированного размера из четырех целых чисел. Массиву назначается метка (rect), а каждому элементу в массиве присваивается уникальный тег элемента. Эти теги помечают каждый элемент в выходных данных XML, чтобы помочь клиенту. Каждый элемент отделяется от следующего запятой или запятой, а также любым сочетанием символов пробела и табуляции. Так как размер массива является фиксированным, пропуск элементов не допускается.

*DataType: шаблоны ARRAY не создают соответствующую схему. Вместо этого используется схема шаблона, именованного в директиве *ElementType .

Рассмотрим следующую запись GDL.

*ImageableArea:   rect( - 10, 20 , +30, 0x40  )  

И рассмотрим шаблон IMAGERECT.

*Template:  IMAGERECT
{
    *Name:  "*ImageableArea"
    *Type:  ATTRIBUTE
    *ValueType:  RECTANGLE
}

Если запись GDL интерпретируется шаблоном IMAGERECT, выходные данные XML будут иметь значение .

<GDL_ATTRIBUTE Name="*ImageableArea"  >
<left  xsi:type="GDLW_int">-10</left>
   <top  xsi:type="GDLW_int">20</top>
   <right  xsi:type="GDLW_int">30</right>
   <bottom  xsi:type="GDLW_int">64</bottom>
</GDL_ATTRIBUTE> 

Обратите внимание, что ссылка на упакованный тип GDLW_int , а не на исходный тип int.