Notas del ejercicio de GDL
En el ejemplo de código siguiente se muestra el árbol de índice que el analizador genera para todos los ejercicios 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>
Las entradas *Name y *POption se asignan a varias plantillas, cada una con una semántica diferente. Por ejemplo, *Name se asigna a NAME, INPUTTRAY_OPT_NAME o PAPER_SIZE_OPT_NAME. *POption se asigna a GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION o INPUTTRAY_OPTION2. Si la estructura de la plantilla se ha definido correctamente, el analizador siguiendo sus reglas de plantillas encontrará la plantilla más adecuada.
Nota Estos ejercicios establecen algunas plantillas básicas y posteriormente variantes derivadas a medida que el esquema se ha vuelto más detallado. Este proceso imita la forma en que un esquema evoluciona en la vida real. La herencia habilitó la extensión del esquema del ejercicio sin cambiar ninguna plantilla definida previamente. Esta característica permite a terceros ampliar el esquema maestro y también garantiza que cualquier extensión de esquema de terceros siga siendo compatible con los usuarios del esquema maestro original.
Las respuestas del ejercicio que se muestran no son únicas. Por ejemplo, podría haber derivado las plantillas MIN_SIZE y MAX_SIZE de PAPERDIMENSIONS de la siguiente manera.
*Template: MIN_SIZE
{
*Name: "*MinSize"
*Inherits: PAPERDIMENSIONS
}
*Template: MAX_SIZE
{
*Name: "*MaxSize"
*Inherits: PAPERDIMENSIONS
}
Tenga en cuenta que las plantillas de PAPER_SIZE_OPT_NAME y INPUTTRAY_OPT_NAME heredan del NOMBRE de la plantilla y también vuelven a definir la entrada *Nombre.
El efecto de redefinir la entrada *Nombre es ocultar estas plantillas derivadas del árbol de herencia que establecen las plantillas base.
Normalmente, cuando una plantilla declara NAME como *Miembro, esta declaración implica que todas las plantillas derivadas de NAME también son *Miembros. Sin embargo, las plantillas derivadas con entradas *Name redefinidas se excluyen de la lista implícita *Miembros de plantillas derivadas. Sin esta exclusión, las entradas de datos que se asignarían originalmente a NOMBRE de plantilla (por ejemplo, *Nombre que aparece dentro de una *Pfeature) se asignarían a INPUTTRAY_OPT_NAME (lo que es incorrecto).
Si prevé la especialización de NAME en PAPER_SIZE_OPT_NAME y INPUTTRAY_OPT_NAME durante el diseño original del esquema, una implementación de esquema diferente daría como resultado simplemente quitar NAME de la lista *Miembros de GENERIC_OPTION. Este cambio haría que fuera innecesario volver a definir *Nombre. Un refinamiento de diseño adicional tendría NAME, PAPER_SIZE_OPT_NAME y INPUTTRAY_OPT_NAME heredar de una plantilla virtual común, ya que esa situación refleja con mayor precisión la relación entre estas palabras clave.