Добавление зависимостей в данные Configuration-Dependent
Директивы *Switch/*Case зависят от параметров, определенных с помощью директив *Feature/*Option . Тег construct конструкции *Switch называет один из параметров, определенных в конструкции *Feature . Ссылка на параметр тегом construct конструкции *Switch может предшествовать его определению через конструкцию *Feature .
Текст конструкции *Switch содержит несколько конструкций *Case и необязательную конструкцию *Default . Другие дочерние записи не могут отображаться в конструкции *Switch . Тег construct конструкции *Case называет одно из допустимых значений, определенных в конструкции *Option , соответствующей параметру, именованному в конструкции *Switch . Тег construct не используется для конструкции*Default .
*Конструкции switch могут отображаться как дочерние записи в любой другой конструкции, за исключением того, что конструкция *Switch не может быть дочерним элементом другой конструкции *Switch . Текст конструкции *Case может содержать любые записи GDL, за исключением того, что конструкция *Case не может быть предком конструкции *Feature или *Default .
Директивы *Switch/*Case очень похожи на конструкции языка C с тем же именем. Содержимое любой конструкции *Case (тег конструкции которого в конфигурации называется текущим значением или состоянием параметра, именованного конструкцией *Switch) может отображаться в snapshot. В противном случае средство синтаксического анализа предотвращает появление записей, содержащихся в конструкции *Case, в snapshot.
Примечание В отличие от C-версии *Switch/*Case, GDL не требуется оператор break, чтобы остановить выполнение после конца конструкции *Case .
Если текст конструкции*Case опущен (т. е. *Case отображается как атрибут, а не конструкция), будет использоваться текст следующей конструкции *Case или *Default . Это поведение снова похоже на поведение в случае переключения/ языкаC. Если конструкция *Default присутствует, она должна отображаться последней после всех записей *Case .
Если параметр разрешает PICKMANY, содержимое нескольких конструкций *Case может отображаться в snapshot. Такая ситуация может привести к созданию нескольких определений одной конструкции или атрибута. Такие множественные определения обрабатываются так же, как если бы они явно отображались в GDL-файле за пределами любой конструкции *Switch/*Case . Если несколько конструкций *Case используют один и тот же текст и несколько имен в конфигурации, содержимое текста будет отображаться только один раз.
Если ни одна из конструкций *Case не называется в конфигурации, используется содержимое конструкции *Default . Если конструкция *Default не определена, вся конструкция *Switch/*Case и все ее потомки исключаются из snapshot.
Если определено несколько одноуровневых конструкций *Switch/*Case , каждая из них оценивается независимо от другой. Слияние одноуровневых конструкций не применяется к конструкциям *Switch/*Case .
Директивы *Switch и *Construct никогда не отображаются в snapshot, поэтому в snapshot дочерние записи конструкции *Caseотображаются как дочерние записи родительского элемента конструкции *Switch.
В следующем примере кода параметр Today определяется так, чтобы принимать дни недели. В примере показаны две одноуровневые конструкции *Switch/*Case ; обе будут оцениваться независимо.
*Schedule:
{
*Switch: Today
{
*Case: Saturday
*Case: Sunday
{
*Eat: Breakfast, Dinner
}
*Case: Monday
*Case: Wednesday
*Case: Friday
{
*Eat: Lunch
}
}
*Switch: Today
{
*Case: Sunday
{
*ToDo: Laundry
}
*Case: Saturday
{
*ToDo: Ballgame
}
*Default:
{
*ToDo: FixBugs
}
}
}
Если в конфигурации указано Today: Saturday
значение , snapshot будет содержать следующий код.
*Schedule:
{
*Eat: Breakfast, Dinner
*ToDo: Ballgame
}
Если в конфигурации указано Today: Wednesday
значение , snapshot будет содержать следующий код.
*Schedule:
{
*Eat: Lunch
*ToDo: FixBugs
}
Если в конфигурации указано Today: Tuesday
значение , snapshot будет содержать следующий код.
*Schedule:
{
*ToDo: FixBugs
}
В следующем примере кода показаны две вложенные конструкции *Switch/*Case .
*Schedule:
{
*Switch: Today
{
*Case: Sunday
{
*Switch: Weather
{
*Case: Sunny
{
*ToDo: Garden
}
*Case: Cloudy
{
*ToDo: Laundry
}
}
}
*Case: Saturday
{
*ToDo: Ballgame
}
*Default:
{
*ToDo: FixBugs
}
}
}