Поделиться через


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"
}