共用方式為


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>

*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。 如果範本結構已正確定義,則遵循其範本化規則的剖析器會找到最適合的範本。

注意 這些練習會建立一些基本範本和後續衍生的變體,因為架構變得更詳細。 此程式會模擬架構在真實生活中的演進方式。 繼承可讓練習架構擴充,而不需要變更任何先前定義的範本。 此功能可讓協力廠商擴充主要架構,並確保任何協力廠商架構延伸模組仍與原始主要架構的使用者相容。

顯示的練習答案不是唯一的。 例如,您可以透過下列方式從 PAPERDIMENSIONS 衍生範本MIN_SIZE和MAX_SIZE。

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

請注意,PAPER_SIZE_OPT_NAME和INPUTTRAY_OPT_NAME範本繼承自範本 NAME,也會重新定義 *Name 專案。

重新定義 *Name 專案的效果是從基底範本所建立的繼承樹狀結構中隱藏這些衍生的範本。

一般而言,當範本將 NAME 宣告為 *Member 時,此宣告表示所有衍生自 NAME 的範本也是 *成員。 不過,已重新定義的衍生範本 *Name 專案會從衍生範本的隱含 *成員清單中排除。 如果沒有這項排除,原本對應至範本 NAME 的資料項目 (例如,*出現在 *Pfeature) 內的名稱會對應至INPUTTRAY_OPT_NAME (不正確) 。

如果您預期在架構原始設計期間將 NAME 特製化為PAPER_SIZE_OPT_NAME和INPUTTRAY_OPT_NAME,則不同的架構實作只會從 [GENERIC_OPTION 的成員] 清單中移除 NAME 而產生。 這項變更會不必要地重新定義 *Name。 進一步的設計精簡化會有名稱、PAPER_SIZE_OPT_NAME和INPUTTRAY_OPT_NAME繼承自通用虛擬範本,因為這種情況更精確地反映這些關鍵字之間的關聯性。