GDL 연습 4: 구문의 변형 정의
운동
*PFeature: PaperSize 및 *PFeature InputTray의 두 가지 변형을 정의하여 연습 3에서 *PFeature 구문을 수정합니다.
*PFeature: PaperSize에 포함된 POption에는 *Name, *Command, *Papersize 특성이 있습니다.
*PFeature: InputTray에 포함된 POption에는 *Name, *Command 및 *Capacity: 시트 수의 특성이 있습니다.
이러한 두 가지 유형의 *POptions의 공통 속성을 추상화하기 위한 템플릿을 만듭니다.
솔루션
다음 템플릿은 조건을 충족합니다.
*Template: COMMAND_TYPE
{
*Type: DATATYPE
*DataType: FILTER_TYPE
*ElementType: XML_STRING
*FilterTypeName: "COMMAND_STRING"
}
*Template: ACOMMAND
{
*Name: "*Command"
*Type: ATTRIBUTE
*ValueType: COMMAND_TYPE
}
다음 파생 옵션 템플릿은 가상 템플릿 POPTION의 속성을 추가로 정의합니다.
*Template: GENERIC_OPTION
{
*Inherits: POPTION
*Members: (NAME, ACOMMAND)
*Instances: <ANY>
}
*Template: XML_INT4
{
*Type: DATATYPE
*DataType: XML_TYPE
*XMLDataType: "int"
}
*Template: INTEGER
{
*Type: DATATYPE
*DataType: FILTER_TYPE
*ElementType: XML_INT4
*FilterTypeName: "HEX_OR_INT"
}
*Template: XML_FLOAT
{
*Type: DATATYPE
*DataType: XML_TYPE
*XMLDataType: "float"
}
*Template: PAIR_OF_FLOAT
{
*Type: DATATYPE
*DataType: ARRAY
*ElementType: XML_FLOAT
*RequiredDelimiter: ","
*OptionalDelimiter: "<20 09>"
*ArrayLabel: "PAIR"
*ElementTags: (width, height)
*ArraySize: 2
}
*Template: LEN_UNITS
{
*Type: DATATYPE
*DataType: ENUMERATOR
*XMLDataType: "LengthUnits"
*EnumeratorList: (inches, mm, microns, pixels)
}
*Template: PAGE_DIM
{
*Type: DATATYPE
*DataType: COMPOSITE
*ElementType: (PAIR_OF_FLOAT, LEN_UNITS)
*RequiredDelimiter: ","
*OptionalDelimiter: "<20 09>"
*ElementTags: (dimensions, units)
}
*Template: PAPERDIMENSIONS
{
*Name: "*PaperSize"
*Type: ATTRIBUTE
*ValueType: PAGE_DIM
}
다음 파생 옵션 템플릿은 템플릿 GENERIC_OPTION 속성을 추가로 특수화합니다.
*Template: PAPERSIZE_OPTION
{
*Name: "*POption" *% Isolate branch from Base Templates
*Inherits: GENERIC_OPTION
*Members: (PAPERDIMENSIONS)
*Instances: <ANY>
}
*Template: PAPERSIZE_FEATURE
{
*Inherits: PFEATURE
*Members: (PAPERSIZE_OPTION)
*Instances: PaperSize
}
*Template: TRAY_CAPACITY
{
*Name: "*Capacity"
*Type: ATTRIBUTE
*ValueType: INTEGER
}
다음 파생 옵션 템플릿은 템플릿 GENERIC_OPTION 속성을 추가로 특수화합니다.
*Template: INPUTTRAY_OPTION
{
*Name: "*POption" *% Isolate branch from Base Templates
*Inherits: GENERIC_OPTION
*Members: (TRAY_CAPACITY)
*Instances: <ANY>
}
*Template: INPUTTRAY_FEATURE
{
*Inherits: PFEATURE
*Members: (INPUTTRAY_OPTION)
*Instances: InputTray
}