Note sugli esercizi GDL

Nell'esempio di codice seguente viene illustrato l'albero degli indici generato dal parser per tutti gli esercizi 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>

Le voci *Nome e *POption vengono mappate a diversi template, ognuno con semantica diversa. Ad esempio, *Name esegue il mapping a NAME, INPUTTRAY_OPT_NAME o PAPER_SIZE_OPT_NAME. *POption corrisponde a GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION o INPUTTRAY_OPTION2. Se la struttura del modello è stata definita correttamente, il parser che segue le regole di templatizzazione troverà il modello più appropriato.

Nota Questi esercizi stabiliscono alcuni modelli di base e successivamente varianti derivate man mano che lo schema è diventato più dettagliato. Questo processo simula il modo in cui uno schema si evolve nella vita reale. L'ereditarietà ha consentito l'estensione dello schema dell'esercizio senza modificare i modelli definiti in precedenza. Questa funzionalità consente a terze parti di estendere lo schema master e garantisce anche che qualsiasi estensione dello schema di terze parti rimanga compatibile con gli utenti dello schema master originale.

Le risposte dell'esercizio visualizzate non sono univoche. Ad esempio, è possibile derivare i modelli MIN_SIZE e MAX_SIZE da PAPERDIMENSIONS nel modo seguente.

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

Si noti che i modelli PAPER_SIZE_OPT_NAME e INPUTTRAY_OPT_NAME ereditano dal nome del modello e ridefiniscono anche la voce *Nome.

L'effetto della ridefinizione della voce *Name consiste nel nascondere questi modelli derivati dall'albero di ereditarietà stabilito dai modelli di base.

In genere, quando un modello dichiara NAME come *Membro, questa dichiarazione implica che anche tutti i modelli derivati da NAME sono *Membri. Tuttavia, i modelli derivati con voci *Nome ridefinite sono esclusi dall'elenco implicito dei *Membri dei modelli derivati. Senza questa esclusione, le voci di dati di cui è stato originariamente eseguito il mapping al template NAME (ad esempio, *Nome visualizzato all'interno di una *Pfeature) verrebbero mappate a INPUTTRAY_OPT_NAME (che non è corretto).

Se si prevede la specializzazione di NAME in PAPER_SIZE_OPT_NAME e INPUTTRAY_OPT_NAME durante la progettazione originale dello schema, un'implementazione dello schema diversa comporterà semplicemente la rimozione di NAME dall'elenco *Membri di GENERIC_OPTION. Questa modifica renderebbe superfluo ridefinire *Nome. Un ulteriore perfezionamento della progettazione sarebbe che NAME, PAPER_SIZE_OPT_NAME e INPUTTRAY_OPT_NAME ereditino da un modello virtuale comune, poiché tale situazione riflette in modo più accurato la relazione tra queste parole chiave.