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


Разрешение конфликтов конфигурации GDL

Хотя средство синтаксического анализа GDL автоматически изменяет конфигурацию, чтобы избежать нарушения ограничения, учитывайте следующие сведения, чтобы средство синтаксического анализа знало ваши намерения.

Например, если конфигурация, передаваемая в функцию синтаксического анализа, содержит параметры Weather.Rain, Today.Sunday, Health.Well, недопустимое сочетание из предыдущего раздела можно устранить, изменив параметр для любого из параметров, именованных в этом ограничении. Средство синтаксического анализа определяет, какой параметр следует изменить. Во многих случаях вы можете знать, какой параметр следует изменить. Как правило, более важный параметр остается без изменений. В этом случае конфликт можно устранить, изменив параметры на Weather:Sunny, Today:Monday или Health:Sick соответственно. Большинство людей предпочтут изменить погоду в первую очередь, сегодня второй, и надеются избежать изменения Здоровья.

Директива *ConflictPriority позволяет указать параметры, которые следует изменить в конфликте. *ConflictPriority принимает положительное целочисленное значение, указывающее относительную важность каждого параметра. Если два или более параметра вступают в конфликт, средство синтаксического анализа изменит параметр параметра с более низким приоритетом. Эта директива соответствует общему использованию, когда элемент с наивысшим приоритетом помечается наименьшим порядковым номером. Таким образом, параметру с наивысшим приоритетом следует назначить *ConflictPriority: 1. Значения, выбранные для параметра *ConflictPriority: не обязательно должны быть последовательными, но должны быть уникальными. *ConflictPriority должен отображаться как дочерняя запись конструкции *Feature.

Директива *FeatureType также влияет на приоритет параметра. *FeatureType фактически является ключевое слово для GPD/Unidrv. Для клиентов, отличных от Unidrv, необходимо просто задать *FeatureType: PARAMETER_PROPERTY. Этот параметр позволит избежать непредвиденных действий в будущем. *FeatureType должен отображаться как дочерняя запись конструкции *Feature.

Когда GDL изменяет параметр для разрешения конфликта, он будет использовать параметр по умолчанию, если это также не ограничено. В некоторых случаях может потребоваться, чтобы средство синтаксического анализа использовало другой параметр по умолчанию при разрешении конфликтов в разных конфигурациях. Чтобы задать такой другой параметр по умолчанию, определите несколько директив *DefaultOption в директивах Switch и Case или во вложенном наборе директив Switch Case. Средство синтаксического анализа оценит параметр и регистр с учетом текущей конфигурации для определения используемого *DefaultOption. Так как алгоритм сопоставителя определяет настройку параметров, начиная с самого высокого приоритета (т. е. наименьшего порядкового номера), параметры параметров с приоритетами, которые ниже приоритета вычисленного параметра, неизвестны. Необходимо убедиться, что любая конструкция Switch, которая окружает директиву *DefaultOption, использует параметры с приоритетами, которые выше (то есть порядковые номера меньшего размера), чем параметр, значение по умолчанию которого определяется с помощью *DefaultOption. Если вы не соблюдаете это правило, функция синтаксического анализа завершится ошибкой. Из-за этой сложности следует избегать вставки *DefaultOption в конструкцию Switch и Case, если это возможно.

Функцию интерфейса синтаксического анализатора ResolveConstraint() можно вызвать для явного проверка конфигурации для нарушений ограничений и разрешения конфликта при обнаружении. Новая конфигурация возвращается вызывающей объекту. Затем вызывающий объект может проверить конфигурацию на допустимость или использовать конфигурацию для получения snapshot. Snapshot указывает, какие параметры параметров ограничены конфигурацией, указанной при создании. Эти сведения могут быть полезны для клиентов, создающих пользовательские интерфейсы.