Объединения конструкций GDL
Если в исходном файле GDL определено несколько конструкций с одинаковым типом конструкции и тегом конструкции, логическое представление этой конструкции ( логическая конструкция) будет содержать объединение содержимого исходных конструкций, определенных в исходном файле GDL.
Тип конструкции и тег конструктора уникальным образом указывают или определяют логическую конструкцию (в контексте ее родительского элемента). В отличие от XML, при определении двух одноуровневых конструкций с одинаковым типом конструкции и тегом конструктора результатом является одна логическая конструкция. На самом деле, конструкции не должны быть даже синтаксическими одноуровневые, они могут быть логическими одноуровневые. (Синтаксические одноуровневые элементы явно находятся в одном теле конструкции, а логические одноуровневые элементы являются дочерними элементами одной логической конструкции.)
Содержимое логической конструкции представляет собой объединение содержимого одноуровневых элементов. В snapshot отображаются логические конструкции, а не конструкции, так как они изначально синтаксически определены в исходном файле GDL. В следующем примере кода существуют две одноуровневые конструкции с типом конструктора: *Person и с тегом конструктора: FlorenceF.
*Person: FlorenceF
{
*Name: Florence Flipo
*Company:Contoso Pharmaceuticals
{
*Location: Redmond, WA
}
}
*Person: FlorenceF
{
*Position: CEO
*Company:Contoso Pharmaceuticals
{
*NumberOfEmployees: 43,000
}
}
Согласно предыдущему правилу, два одноуровневых элемента определяют единую логическую конструкцию, содержащую объединение обоих одноуровневых элементов.
*Person: FlorenceF
{
*Name: Florence Flipo
*Company:Contoso Pharmaceuticals
{
*Location: Redmond, WA
}
*Position: CEO
*Company:Contoso Pharmaceuticals
{
*NumberOfEmployees: 43,000
}
}
Обратите внимание, что слияние в предыдущем примере создало две новые одноуровневые конструкции с одинаковым типом конструкции: *Company и Construct Tag: Contoso Pharmaceuticals.
Если то же правило будет применено повторно (рекурсивно), результатом будет следующий код.
*Person: FlorenceF
{
*Name: Florence Flipo
*Company:Contoso Pharmaceuticals
{
*Location: Redmond, WA
*NumberOfEmployees: 43,000
}
*Position: CEO
}
Любой из трех предыдущих фрагментов GDL при их анализе создает одно и то же внутреннее представление. Внутреннее представление больше всего напоминает последний фрагмент.
При умножении атрибутов с одинаковыми ключевое слово слияние не выполняется. Каждое определение по-прежнему существует во внутреннем представлении. Директива шаблона *Аддитивные используется для указания того, какие значения передаются в snapshot.
Средство синтаксического анализа GDL принимает синтаксическое представление потока GDL и создает внутреннее логическое представление команд GDL. Внутреннее представление этих команд затем преобразуется в XML и становится snapshot.