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 が共通の仮想テンプレートから継承されます。これは、その状況がこれらのキーワード間の関係をより正確に反映しているためです。