Adicionando dependências aos dados do Configuration-Dependent
As diretivas *Switch/*Case fazem com que os dados dependam dos parâmetros definidos usando as diretivas *Feature/*Option . A marca de construção do constructo *Switch nomeia um dos parâmetros definidos em um constructo *Feature . A referência de um parâmetro pela marca de construção do constructo *Switch pode preceder sua definição por meio do constructo *Feature .
O corpo de um constructo *Switch contém vários constructos *Case e um constructo *Default opcional. Nenhuma outra entrada filho pode aparecer dentro do constructo *Switch . A marca de construção do constructo *Case nomeia um dos valores permitidos definidos em um constructo *Option que corresponde ao parâmetro nomeado no constructo *Switch . A marca de construção não é usada para o constructo *Padrão .
*Os constructos de comutador podem aparecer como entradas filho em qualquer outro constructo, exceto que um constructo *Switch não pode ser o filho de outro constructo *Switch . O corpo de um constructo *Case pode conter qualquer entrada GDL, exceto que o constructo *Case não pode ser o ancestral de um constructo *Feature ou *Default .
As diretivas *Switch/*Case funcionam de forma muito semelhante aos constructos da linguagem C de mesmo nome. O conteúdo de qualquer constructo *Case (cuja marca de construção é nomeada na configuração como o valor ou estado atual do parâmetro nomeado pelo constructo *Switch) tem permissão para aparecer no instantâneo. Caso contrário, o analisador impede que as entradas contidas no constructo *Case apareçam no instantâneo.
Nota Ao contrário da versão C de *Switch/*Case, a GDL não precisa de uma instrução break para impedir que a execução continue após o final do constructo *Case .
Se o corpo de um constructo Case for omitido (ou seja, *Case aparece como um atributo em vez de um constructo), o corpo do próximo constructo *Case ou *Default será usado. Esse comportamento é novamente semelhante ao comportamento nocaso de opção da linguagem/ C. Se o constructo *Padrão estiver presente, ele deverá aparecer por último, depois de todas as entradas *Case .
Se o parâmetro permitir PICKMANY, o conteúdo de vários constructos *Case poderá aparecer no instantâneo. Essa situação pode levar a várias definições do mesmo constructo ou atributo. Essas várias definições são tratadas como se aparecessem explicitamente no arquivo GDL fora de qualquer constructo *Switch/*Case . Se vários constructos *Case compartilharem o mesmo corpo e mais de um for nomeado na configuração, o conteúdo do corpo aparecerá apenas uma vez.
Se nenhum dos constructos *Case for nomeado na configuração, o conteúdo do constructo *Default será usado. Se nenhum constructo *Padrão for definido, todo o constructo *Switch/*Case e todas as suas entradas descendentes serão excluídos do instantâneo.
Se vários constructos irmãos *Switch/*Case forem definidos, cada um será avaliado independentemente do outro. A mesclagem de constructos irmãos não se aplica a constructos *Switch/*Case .
As diretivas *Switch e *Construct nunca aparecem no instantâneo, portanto, no instantâneo, as entradas filho do constructo *Caseaparecem como as entradas filho do pai do constructo *Switch.
No exemplo de código a seguir, um parâmetro Today é definido para levar dias da semana. O exemplo mostra dois constructos irmãos *Switch/*Case ; ambos serão avaliados de forma independente.
*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
}
}
}
Se a configuração especificar Today: Saturday
, o instantâneo conterá o código a seguir.
*Schedule:
{
*Eat: Breakfast, Dinner
*ToDo: Ballgame
}
Se a configuração especificar Today: Wednesday
, o instantâneo conterá o código a seguir.
*Schedule:
{
*Eat: Lunch
*ToDo: FixBugs
}
Se a configuração especificar Today: Tuesday
, o instantâneo conterá o código a seguir.
*Schedule:
{
*ToDo: FixBugs
}
O exemplo de código a seguir mostra dois constructos *Switch/*Case aninhados.
*Schedule:
{
*Switch: Today
{
*Case: Sunday
{
*Switch: Weather
{
*Case: Sunny
{
*ToDo: Garden
}
*Case: Cloudy
{
*ToDo: Laundry
}
}
}
*Case: Saturday
{
*ToDo: Ballgame
}
*Default:
{
*ToDo: FixBugs
}
}
}