Примечания к упражнениям GDL
В следующем примере кода показано дерево индексов, которое средство синтаксического анализа создает для всех упражнений GDL.
<:ROOT2>
*PFeature : InputTray <:INPUTTRAY_FEATURE>
*POption : Lower <:INPUTTRAY_OPTION2>
*Capacity <:TRAY_CAPACITY>
*Command <:ACOMMAND>
*Name <:INPUTTRAY_OPT_NAME>
*POption : Upper <:INPUTTRAY_OPTION2>
*Capacity <:TRAY_CAPACITY>
*Command <:ACOMMAND>
*Name <:INPUTTRAY_OPT_NAME>
*DefaultOption <:DEFAULT_OPT>
*Name <:NAME>
*PFeature : PaperSize <:PAPERSIZE_FEATURE>
*POption : Custom <:CUST_PAPERSIZE_OPTION>
*MinSize <:MIN_SIZE>
*MaxSize <:MAX_SIZE>
*Command <:ACOMMAND>
*Name <:PAPER_SIZE_OPT_NAME>
*POption : OEMName_Special_size <:OEM_PAPERSIZE_OPTION>
*OEM_Info <:OEM_INFO>
*PaperSize <:PAPERDIMENSIONS>
*Command <:ACOMMAND>
*Name <:PAPER_SIZE_OPT_NAME>
*POption : A4 <:PREDEFINED_PAPERSIZE_OPTION>
*PaperSize <:PAPERDIMENSIONS>
*Command <:ACOMMAND>
*Name <:PAPER_SIZE_OPT_NAME>
*POption : Legal <:PREDEFINED_PAPERSIZE_OPTION>
*PaperSize <:PAPERDIMENSIONS>
*Command <:ACOMMAND>
*Name <:PAPER_SIZE_OPT_NAME>
*POption : Letter <:PREDEFINED_PAPERSIZE_OPTION>
*PaperSize <:PAPERDIMENSIONS>
*Command <:ACOMMAND>
*Name <:PAPER_SIZE_OPT_NAME>
*DefaultOption <:DEFAULT_OPT>
*Name <:NAME>
*PFeature : random <:PFEATURE >
*POption : First <:GENERIC_OPTION>
*Command <:ACOMMAND>
*Name <:NAME>
*DefaultOption <:DEFAULT_OPT>
*Name <:NAME>
Записи *Name и *POption сопоставляются с несколькими шаблонами, каждый из которых имеет разную семантику. Например, *Name сопоставляется с NAME, INPUTTRAY_OPT_NAME или PAPER_SIZE_OPT_NAME. *POption сопоставляется с GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION или INPUTTRAY_OPTION2. Если структура шаблона определена правильно, средство синтаксического анализа, следуя его правилам шаблонизации, найдет наиболее подходящий шаблон.
Примечание Эти упражнения устанавливают некоторые базовые шаблоны и последующие производные варианты по мере того, как схема стала более подробной. Этот процесс имитирует то, как схема развивается в реальной жизни. Наследование позволило расширить схему упражнения без изменения ранее определенных шаблонов. Эта функция позволяет третьим лицам расширять схему master, а также гарантирует, что любое стороннее расширение схемы остается совместимым с пользователями исходной схемы master.
Отображаемые ответы на упражнения не являются уникальными. Например, можно получить шаблоны MIN_SIZE и MAX_SIZE из PAPERDIMENSIONS следующим образом.
*Template: MIN_SIZE
{
*Name: "*MinSize"
*Inherits: PAPERDIMENSIONS
}
*Template: MAX_SIZE
{
*Name: "*MaxSize"
*Inherits: PAPERDIMENSIONS
}
Обратите внимание, что шаблоны PAPER_SIZE_OPT_NAME и INPUTTRAY_OPT_NAME наследуются от шаблона NAME, а также переопределяет запись *Name.
Результатом переопределения записи *Name является скрытие этих производных шаблонов из дерева наследования, устанавливаемого базовыми шаблонами.
Как правило, когда шаблон объявляет NAME как *Member, это объявление подразумевает, что все шаблоны, производные от NAME, также являются *Members. Однако производные шаблоны с переопределенными записями *Name исключаются из неявного списка *Members производных шаблонов. Без этого исключения записи данных, которые изначально были бы сопоставлены с шаблоном NAME (например, *Имя, отображающееся в *Pfeature), будут сопоставлены с INPUTTRAY_OPT_NAME (что неверно).
Если вы ожидаете специализацию NAME на PAPER_SIZE_OPT_NAME и INPUTTRAY_OPT_NAME во время первоначального проектирования схемы, другая реализация схемы приведет к простому удалению NAME из списка *Members GENERIC_OPTION. Это изменение приведет к необходимости переопределить *Name. Дальнейшее уточнение структуры будет иметь NAME, PAPER_SIZE_OPT_NAME и INPUTTRAY_OPT_NAME наследование от общего виртуального шаблона, так как эта ситуация более точно отражает связь между этими ключевыми словами.