Typy danych szablonu tablicy

Typy danych ARRAY składają się z co najmniej jednej wartości, która ma ten sam typ danych. Tablice można zdefiniować tak, aby stały, zmienny lub nieokreślony.

*DataType: ARRAY kieruje szablon do zdefiniowania złożonego typu danych, którego składowe są tym samym typem danych (znanym również jako typ danych elementów członkowskich). Elementy członkowskie typu danych tablicy będą danymi wyjściowymi jako poszczególne elementy podrzędne XML należące do elementu reprezentującego otaczający kontekst.

Jeśli każdy element podrzędny reprezentuje typ danych pierwotny, typ danych zostanie zdefiniowany przez atrybut XML xsi:type w każdym elemecie. Jeśli atrybut GDL jest zdefiniowany jako typu danych ARRAY, otaczający kontekst będzie elementem <GDL_ATTRIBUTE>. Nazwa elementu każdego elementu podrzędnego XML będzie odpowiednim tagiem, który definiuje *ElementTags dyrektywy. Jeśli sam składnik ZŁOŻONY jest elementem członkowskim innego złożonego typu danych, zostanie utworzony element reprezentujący ten otaczający kontekst. Nazwa tego elementu nadrzędnego będzie odpowiednim tagiem przypisanym przez szablon, który zdefiniował otaczający złożony typ danych.

Następujące dyrektywy służą do definiowania typu danych ARRAY:

  • *ElementType (wymagane). Nazwa szablonu definiującego typ danych wszystkich elementów. Można określić tylko jeden typ danych.

  • *RequiredDelimiter (wymagane). Ciąg, który syntactically oddziela każdy element tablicy od następnego. Dwa kolejne ograniczniki zostaną zinterpretowane jako pominięty element. Ograniczniki nie są potrzebne, aby wskazać pominięcie elementów końcowych. Należy zachować ostrożność, jeśli biały znak jest używany jako ogranicznik lub jako część ciągu ogranicznika. Na przykład dodatkowe znaki spacji będą interpretowane przez analizator jako wskazujący pominięte elementy; i ponieważ może nie być w stanie zobaczyć takich dodatkowych znaków odstępów, mogą wystąpić nieoczekiwane błędy analizowania.

    Ponadto nadmiar odstępu jest rutynowo usuwany z pliku źródłowego, a odstępy są często dodawane do strumienia wejściowego w wyniku przetwarzania wstępnego, makra i komentarza. W związku z tym rzeczywisty ciąg, który jest analizowany, może mieć zupełnie inną liczbę znaków spacji niż pierwotnie określony.

    Nie należy używać znaków tabulacji w ramach wymaganego ciągu ogranicznika, ponieważ są one rutynowo konwertowane na znaki spacji podczas przetwarzania danych wejściowych.

  • *OptionalDelimiter (opcjonalnie). Każdy ciąg składający się z znaków określonych w *OptionalDelimiter i który wydaje się sąsiadować z *RequiredDelimiter ciąg będzie uważany za część ogranicznika. Pierwszy znak zdefiniowany w ciągu *RequiredDelimiter nie może pojawić się w *OptionalDelimiter.

  • *ElementTags (wymagane). Jeśli chcesz przypisać każdy element w tablicy o tej samej nazwie elementu (lub jeśli tablica może mieć nieograniczony rozmiar), podaj tylko jeden tag. W przeciwnym razie podaj liczbę równą maksymalnej wartości, która *ArraySize określa.

    Każdy element członkowski tablicy będzie mieć nazwę z odpowiednim tagiem. To nazewnictwo jest przydatne, jeśli pominięto co najmniej jeden element tablicy. Gdy elementy tablicy zostaną pominięte, tag odpowiadający pominiętym elementowi nie jest używany. Aby uniknąć mylące klienta, nie należy używać nazw elementów zarezerwowanych migawek GDL (czyli CONSTRUCT, ATTRIBUTE i Personality) jako nazw tagów.

  • *ArraySize (wymagane). Użyj jednej liczby całkowitej, aby określić rozmiar tablicy o stałym rozmiarze lub użyć dwóch liczb całkowitych, aby określić minimalny i maksymalny dozwolony rozmiar tablicy o zmiennym rozmiarze. Należy pamiętać, że zero jest dozwolone dla minimalnego rozmiaru, a symbol wieloznaczny GPD (*) może służyć do określenia rozmiaru lub maksymalnego rozmiaru. Wskaż pominięte wartości w danych wystąpienia z kolejnymi przecinkami (na przykład *DaysOfWeek: (Sunday, Monday, , Wednesday, , Friday,).

  • *ArrayLabel (opcjonalnie). Jeśli ta dyrektywa zostanie określona, lista elementów tablicy musi być ujęta nawiasami i poprzedzona etykietą *ArrayLabel. Jeśli w tej dyrektywie nie określono żadnej etykiety, nawiasy są opcjonalne, a etykieta wstępna nie jest dozwolona.

Rozważmy następujący szablon.

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

Ten szablon definiuje tablicę o stałym rozmiarze z czterema liczbami całkowitymi. Tablica ma przypisaną etykietę (rect), a każdy element w tablicy ma przypisany unikatowy tag elementu. Te tagi będą oznaczać każdy element w danych wyjściowych XML, aby ułatwić klientowi. Każdy element jest oddzielony od następnego przecinkiem lub przecinkiem oraz dowolną kombinacją spacji i znaków tabulacji. Ponieważ rozmiar tablicy jest stały, nie jest dozwolone pominięcie elementów.

*DataType: szablony tablic nie generują odpowiedniego schematu. Zamiast tego jest używany schemat szablonu o nazwie w dyrektywie *ElementType.

Rozważmy następujący wpis GDL.

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

Rozważ szablon IMAGERECT.

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

Jeśli wpis GDL jest interpretowany przez szablon IMAGERECT, wynikowe dane wyjściowe XML będą.

<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> 

Należy pamiętać, że odwołanie dotyczy typu opakowanego GDLW_int, a nie oryginalnego int.