GDL-Übungshinweise
Das folgende Codebeispiel zeigt die Indexstruktur, die der Parser für alle GDL-Übungen generiert.
<: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>
Die Einträge *Name und *POption werden mehreren Vorlagen mit unterschiedlicher Semantik zugeordnet. *Name wird beispielsweise NAME, INPUTTRAY_OPT_NAME oder PAPER_SIZE_OPT_NAME zugeordnet. *POption wird GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION oder INPUTTRAY_OPTION2 zugeordnet. Wenn die Vorlagenstruktur ordnungsgemäß definiert wurde, findet der Parser nach seinen Vorlagenregeln die am besten geeignete Vorlage.
Hinweis Diese Übungen erstellen einige grundlegende Vorlagen und anschließend abgeleitete Varianten, wenn das Schema detaillierter wurde. Dieser Prozess imitiert die Art und Weise, wie sich ein Schema in der Praxis weiterentwickelt. Durch vererbung konnte das Übungsschema erweitert werden, ohne zuvor definierte Vorlagen zu ändern. Dieses Feature ermöglicht Es Drittanbietern, das master Schema zu erweitern, und stellt außerdem sicher, dass alle Schemaerweiterungen von Drittanbietern mit Benutzern des ursprünglichen master Schemas kompatibel bleiben.
Die gezeigten Übungsantworten sind nicht eindeutig. Sie hätten z. B. die Vorlagen MIN_SIZE und MAX_SIZE auf folgende Weise von PAPERDIMENSIONS abgeleitet.
*Template: MIN_SIZE
{
*Name: "*MinSize"
*Inherits: PAPERDIMENSIONS
}
*Template: MAX_SIZE
{
*Name: "*MaxSize"
*Inherits: PAPERDIMENSIONS
}
Beachten Sie, dass die Vorlagen PAPER_SIZE_OPT_NAME und INPUTTRAY_OPT_NAME vom Vorlagennamen erben und auch den *Name-Eintrag neu definieren.
Die Neudefinition des *Name-Eintrags bewirkt, dass diese abgeleiteten Vorlagen in der Vererbungsstruktur ausgeblendet werden, die von den Basisvorlagen erstellt wird.
Wenn eine Vorlage NAME als *Member deklariert, impliziert diese Deklaration in der Regel, dass alle vorlagen, die von NAME abgeleitet sind, auch *Member sind. Abgeleitete Vorlagen mit neu definierten *Namenseinträgen sind jedoch aus der implizierten *Member-Liste abgeleiteter Vorlagen ausgeschlossen. Ohne diesen Ausschluss würden Dateneinträge, die ursprünglich der Vorlage NAME zugeordnet wären (z. B. *Name, der innerhalb eines *Pfeatures angezeigt wird) INPUTTRAY_OPT_NAME zugeordnet (was falsch ist).
Wenn Sie die Spezialisierung von NAME auf PAPER_SIZE_OPT_NAME und INPUTTRAY_OPT_NAME während des ursprünglichen Entwurfs des Schemas erwarten, würde eine andere Schemaimplementierung durch einfaches Entfernen von NAME aus der *Member-Liste der GENERIC_OPTION. Diese Änderung würde es unnötig machen, *Name neu zu definieren. Eine weitere Entwurfseinschränkung würde dazu führen, dass NAME, PAPER_SIZE_OPT_NAME und INPUTTRAY_OPT_NAME von einer gemeinsamen virtuellen Vorlage erben, da diese Situation die Beziehung zwischen diesen Schlüsselwörtern genauer widerspiegelt.