Ejercicio 2 de GDL: Heredar de plantillas virtuales
Ejercicio
Defina un tipo de datos que acepte una cadena Unicode codificada mediante 2 bytes para representar 1 carácter Unicode. A continuación, defina plantillas no virtuales que hereden de las plantillas virtuales definidas anteriormente. No modifique el esquema que creó en el ejercicio 1. Cree un archivo de datos GDL de ejemplo y compruebe que el esquema se aplica correctamente. Cree un archivo de datos GDL de ejemplo que no se ajuste al esquema y compruebe que se detectan los errores.
Solución de
Las dos plantillas siguientes definen el tipo de datos Unicode.
*Include: MasterTemplate.gdl
*Template: XML_STRING
{
*Type: DATATYPE
*DataType: XML_TYPE
*XMLDataType: "string"
}
*Template: NORMAL_STRING
{
*Type: DATATYPE
*DataType: FILTER_TYPE
*ElementType: XML_STRING
*FilterTypeName: "NORMAL_STRING"
}
La plantilla siguiente hereda de las plantillas definidas en el ejercicio 1. Hay una construcción denominada *Command y tres tipos de atributos: *Name (que aparece en el nivel raíz), *CommandName (que puede aparecer dentro de una construcción *Command) y *UniName (que puede aparecer dentro de ambos contextos).
*Template: COMMAND
{
*Name: "*Command"
*Inherits: CONSTRUCTS
*Instances: <ANY>
}
*Template: ROOT_NAME
{
*Name: "*Name"
*Inherits: ROOT_ATTRIB
*ValueType: NORMAL_STRING
}
*Template: CMD_NAME
{
*Name: "*CommandName"
*Inherits: CONSTRUCT_ATTRIB
*ValueType: NORMAL_STRING
}
*Template: UNIVERSAL_NAME
{
*Name: "*UniName"
*Inherits: FREEFLOAT
*ValueType: NORMAL_STRING
}
El siguiente archivo GDL se ajusta al esquema especificado.
*Name: "can only appear at root level"
*UniName: "can appear anywhere"
*Command: X
{
*CommandName: "May only appear within a command"
*UniName: "can appear anywhere, even in a command"
*Command: nested
{
*CommandName: "nested commands are ok."
*UniName: "template defined a recursive nesting" 100 %
}
}
El siguiente archivo GDL no se ajusta al esquema especificado.
*CommandName: "Error! May only appear within a command"
*Command: X
{
*Name: "Error! can only appear at root level"
}