GDL, упражнение 2. Наследование от виртуальных шаблонов
Упражнения
Определите тип данных, который принимает строку Юникода, которая закодирована с использованием 2 байтов для представления 1 символа Юникода. Затем определите не виртуальные шаблоны, которые наследуются от ранее определенных виртуальных шаблонов. Не изменяйте схему, созданную в упражнении 1. Создайте пример файла данных GDL и убедитесь, что схема применена правильно. Создайте пример файла данных GDL, который не соответствует схеме, и убедитесь, что ошибки обнаружены.
Решение
Следующие два шаблона определяют тип данных Юникода.
*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"
}
Следующий шаблон наследуется от шаблонов, определенных в упражнении 1. Существует конструкция с именем *Command и три типа атрибутов: *Имя (которое отображается на корневом уровне), *CommandName (которое может отображаться в конструкции *Command) и *UniName (которое может отображаться в обоих контекстах).
*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
}
Следующий GDL-файл соответствует заданной схеме.
*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 %
}
}
Следующий GDL-файл не соответствует заданной схеме.
*CommandName: "Error! May only appear within a command"
*Command: X
{
*Name: "Error! can only appear at root level"
}