次の方法で共有


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 から派生したすべてのテンプレートも *Member であることを意味します。 ただし、再定義された *Name エントリを持つ派生テンプレートは、派生テンプレートの暗黙的な *Members リストから除外されます。 この除外がないと、もともとテンプレート NAME にマップされていたデータ エントリ (たとえば、*Pfeature 内に表示される *Name) が INPUTTRAY_OPT_NAME にマップされます (これは正しくありません)。

スキーマの元の設計時に NAME が PAPER_SIZE_OPT_NAME と INPUTTRAY_OPT_NAME に特殊化されることが予想される場合は、GENERIC_OPTION の *Members リストから NAME を削除するだけで、異なるスキーマ実装が行われます。 この変更により、*Name を再定義する必要はないでしょう。 さらにデザインを改良すると、NAME、PAPER_SIZE_OPT_NAME、INPUTTRAY_OPT_NAME が共通の仮想テンプレートから継承されます。これは、その状況がこれらのキーワード間の関係をより正確に反映しているためです。