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


Примечания к упражнениям 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 наследование от общего виртуального шаблона, так как эта ситуация более точно отражает связь между этими ключевыми словами.