Partilhar via


Notas do exercício GDL

O exemplo de código a seguir mostra a árvore de índice que o analisador gera para todos os exercícios de 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>

As entradas *Name e *POption são mapeadas para vários modelos, cada um com semântica diferente. Por exemplo, *Nome mapeia para NOME, INPUTTRAY_OPT_NAME ou PAPER_SIZE_OPT_NAME. *POption mapeia para GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION ou INPUTTRAY_OPTION2. Se a estrutura do modelo tiver sido definida corretamente, o analisador que segue suas regras de templatização encontrará o modelo mais apropriado.

Nota Esses exercícios estabelecem alguns modelos básicos e variantes derivadas posteriormente à medida que o esquema se tornava mais detalhado. Esse processo imita a maneira como um esquema evolui na vida real. A herança permitiu que o esquema de exercício fosse estendido sem alterar nenhum modelo definido anteriormente. Esse recurso permite que terceiros estendam o esquema master e também garante que qualquer extensão de esquema de terceiros permaneça compatível com os usuários do esquema de master original.

As respostas do exercício mostradas não são exclusivas. Por exemplo, você poderia ter derivado os modelos MIN_SIZE e MAX_SIZE de PAPERDIMENSIONS da maneira a seguir.

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

Observe que os modelos PAPER_SIZE_OPT_NAME e INPUTTRAY_OPT_NAME herdam do NOME do modelo e também redefinem a entrada *Name.

O efeito de redefinir a entrada *Name é ocultar esses modelos derivados da árvore de herança estabelecida pelos modelos de base.

Normalmente, quando um modelo declara NAME como um *Membro, essa declaração implica que todos os modelos derivados de NAME também são *Membros. No entanto, modelos derivados com entradas *Name redefinidas são excluídos da lista *Membros implícita de modelos derivados. Sem essa exclusão, as entradas de dados que teriam mapeado originalmente para o NOME do modelo (por exemplo, *Nome que aparece em um *Pfeature) seriam mapeadas para INPUTTRAY_OPT_NAME (o que está incorreto).

Se você prever a especialização de NAME em PAPER_SIZE_OPT_NAME e INPUTTRAY_OPT_NAME durante o design original do esquema, uma implementação de esquema diferente resultará simplesmente pela remoção de NAME da lista *Membros de GENERIC_OPTION. Essa alteração tornaria desnecessário redefinir *Nome. Um refinamento de design adicional teria NAME, PAPER_SIZE_OPT_NAME e INPUTTRAY_OPT_NAME herdando de um modelo virtual comum, pois essa situação reflete com mais precisão a relação entre essas palavras-chave.