GDL 练习 2:从虚拟模板继承

运动

定义接受 Unicode 字符串的数据类型,该字符串使用 2 个字节来表示 1 个 Unicode 字符。 然后,定义继承自先前定义的虚拟模板的非虚拟模板。 请勿修改 在练习 1 中创建的架构。 创建示例 GDL 数据文件,并验证架构是否已正确应用。 创建不符合架构的示例 GDL 数据文件,并验证是否检测到错误。

解决方案

以下两个模板定义 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"
}

以下模板继承自练习 1 中定义的模板。 有一个名为 *Command 的构造和三种类型的属性: *Name (显示在根级别) 、 *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"
}