Exercício 2 do GDL: Herdando de modelos virtuais
Exercício
Defina um tipo de dados que aceite uma cadeia de caracteres Unicode codificada usando 2 bytes para representar um caractere Unicode. Em seguida, defina modelos não virtuais que herdam dos modelos virtuais definidos anteriormente. Não modifique o esquema que você criou no Exercício 1. Crie um arquivo de dados GDL de exemplo e verifique se o esquema foi aplicado corretamente. Crie um arquivo de dados GDL de exemplo que não esteja em conformidade com o esquema e verifique se os erros foram detectados.
Solução
Os dois modelos a seguir definem o tipo de dados 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"
}
O modelo a seguir herda dos modelos definidos no Exercício 1. Há um constructo chamado *Command e três tipos de atributos: *Name (que aparece no nível raiz), *CommandName (que pode aparecer em um constructo *Command) e *UniName (que pode aparecer em ambos os 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
}
O arquivo GDL a seguir está em conformidade com o 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 %
}
}
O arquivo GDL a seguir não está em conformidade com o esquema especificado.
*CommandName: "Error! May only appear within a command"
*Command: X
{
*Name: "Error! can only appear at root level"
}