共用方式為


GDL 練習 2:繼承自虛擬範本

運動

定義資料類型,接受使用 2 個位元組來表示 1 個 Unicode 字元編碼的 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 的建構和三種屬性類型: *名稱 (出現在根層級) 、 *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"
}