GDL 연습 정보

다음 코드 예제에서는 파서가 모든 GDL 연습에 대해 생성하는 인덱스 트리를 보여 줍니다.

      <:ROOT2>
    *PFeature : InputTray    <:INPUTTRAY_FEATURE>
        *POption : Lower    <:INPUTTRAY_OPTION2>
            *Capacity    <:TRAY_CAPACITY>
            *Command    <:ACOMMAND>
            *Name    <:INPUTTRAY_OPT_NAME>
        *POption : Upper    <:INPUTTRAY_OPTION2>
            *Capacity    <:TRAY_CAPACITY>
            *Command    <:ACOMMAND>
            *Name    <:INPUTTRAY_OPT_NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>
    *PFeature : PaperSize    <:PAPERSIZE_FEATURE>
        *POption : Custom    <:CUST_PAPERSIZE_OPTION>
            *MinSize    <:MIN_SIZE>
            *MaxSize    <:MAX_SIZE>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : OEMName_Special_size    <:OEM_PAPERSIZE_OPTION>
            *OEM_Info    <:OEM_INFO>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : A4    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : Legal    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : Letter    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>
    *PFeature : random    <:PFEATURE >
        *POption : First    <:GENERIC_OPTION>
            *Command    <:ACOMMAND>
            *Name    <:NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>

*이름 및 *POption 항목은 각각 서로 다른 의미 체계를 가진 여러 템플릿에 매핑됩니다. 예를 들어 *Name은 NAME, INPUTTRAY_OPT_NAME 또는 PAPER_SIZE_OPT_NAME 매핑됩니다. *POption은 GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION 또는 INPUTTRAY_OPTION2 매핑됩니다. 템플릿 구조가 올바르게 정의되면 템플릿 규칙 다음의 파서에서 가장 적절한 템플릿을 찾습니다.

참고 이러한 연습에서는 스키마가 더 자세히 설명됨에 따라 몇 가지 기본 템플릿과 이후에 파생된 변형을 설정합니다. 이 프로세스는 스키마가 실제 환경에서 진화하는 방식을 모방합니다. 상속을 사용하면 이전에 정의된 템플릿을 변경하지 않고도 연습 스키마를 확장할 수 있었습니다. 이 기능을 사용하면 타사에서 master 스키마를 확장하고 타사 스키마 확장이 원래 master 스키마의 사용자와 호환되도록 할 수 있습니다.

표시되는 연습 답변은 고유하지 않습니다. 예를 들어 다음과 같은 방식으로 MIN_SIZE 템플릿을 파생하고 PAPERDIMENSIONS에서 MAX_SIZE 수 있습니다.

*Template:  MIN_SIZE
{
    *Name: "*MinSize"
    *Inherits: PAPERDIMENSIONS
}
*Template:  MAX_SIZE
{
    *Name: "*MaxSize"
    *Inherits: PAPERDIMENSIONS
}

PAPER_SIZE_OPT_NAME 및 INPUTTRAY_OPT_NAME 템플릿은 템플릿 이름에서 상속되며 *이름 항목도 다시 정의합니다.

*이름 항목을 다시 정의하면 기본 템플릿이 설정하는 상속 트리에서 이러한 파생 템플릿을 숨기는 효과가 있습니다.

일반적으로 템플릿이 NAME을 *Member로 선언하는 경우 이 선언은 NAME에서 파생된 모든 템플릿도 *멤버임을 의미합니다. 그러나 *이름 항목이 다시 정의된 파생 템플릿은 파생 템플릿의 암시적 *멤버 목록에서 제외됩니다. 이 제외가 없으면 원래 템플릿 이름에 매핑된 데이터 항목(예: *Pfeature 내에 나타나는 *이름)이 INPUTTRAY_OPT_NAME 매핑됩니다(잘못된 경우).

스키마의 원래 디자인 중에 NAME을 PAPER_SIZE_OPT_NAME 및 INPUTTRAY_OPT_NAME 전문화할 것으로 예상되는 경우 다른 스키마 구현은 단순히 *GENERIC_OPTION 멤버 목록에서 NAME을 제거하면 됩니다. 이렇게 변경하면 *이름을 다시 정의할 필요가 없습니다. 추가 디자인 구체화에는 공통 가상 템플릿에서 상속되는 NAME, PAPER_SIZE_OPT_NAME 및 INPUTTRAY_OPT_NAME 있습니다. 이러한 상황은 이러한 키워드 간의 관계를 보다 정확하게 반영하기 때문입니다.