Agregar dependencias a los datos de Configuration-Dependent
Las directivas *Switch/*Case hacen que los datos dependan de los parámetros definidos mediante las directivas *Feature/*Option . La etiqueta de construcción de *Switch denomina uno de los parámetros definidos en una construcción *Feature . La referencia de un parámetro mediante la etiqueta de construcción de la construcción *Switch podría preceder a su definición a través de la construcción *Feature .
El cuerpo de una construcción *Switch contiene una serie de construcciones *Case y una construcción opcional *Default . Ninguna otra entrada secundaria puede aparecer dentro de la construcción *Switch . La etiqueta de construcción de la construcción *Case asigna uno de los valores permitidos definidos en una construcción *Option que corresponde al parámetro denominado en la construcción *Switch . La etiqueta de construcción no se usa para la construcción*Default .
*Las construcciones switch pueden aparecer como entradas secundarias dentro de cualquier otra construcción, salvo que una construcción *Switch no puede ser el elemento secundario de otra construcción *Switch . El cuerpo de una construcción *Case puede contener cualquier entrada GDL, excepto que la construcción *Case no puede ser el antecesor de una construcción *Feature o *Default .
Las directivas *Switch/*Case funcionan de forma muy similar a las construcciones del lenguaje C del mismo nombre. El contenido de cualquier construcción *Case (cuya etiqueta de construcción se denomina en la configuración como el valor actual o el estado del parámetro denominado por la construcción *Switch ) pueden aparecer en la instantánea. De lo contrario, el analizador impide que las entradas contenidas en la construcción *Case aparezcan en la instantánea.
Nota A diferencia de la versión C de *Switch/*Case, GDL no necesita una instrucción break para impedir que la ejecución continúe más allá del final de la construcción *Case .
Si se omite el cuerpo de una construcción*Case (es decir, *Case aparece como un atributo en lugar de una construcción), se usará el cuerpo del siguiente *Caso o *Construcción predeterminada . Este comportamiento es similar al comportamiento en el caso del modificador/ del lenguajeC. Si la construcción *Default está presente, debe aparecer en último lugar, después de todas las entradas *Case .
Si el parámetro permite PICKMANY, el contenido de varias construcciones *Case puede aparecer en la instantánea. Esta situación podría dar lugar a varias definiciones de la misma construcción o atributo. Estas definiciones múltiples se controlan igual que si aparecen explícitamente en el archivo GDL fuera de cualquier construcción *Switch/*Case . Si varias construcciones *Case comparten el mismo cuerpo y más de una se denomina en la configuración, el contenido del cuerpo solo aparecerá una vez.
Si ninguna de las construcciones *Case se denomina en la configuración, se usa el contenido de la *construcción predeterminada . Si no se define ninguna construcción *Default , toda la construcción *Switch/*Case y todas sus entradas descendientes se excluyen de la instantánea.
Si se definen varias construcciones del mismo nivel *Switch/*Case , cada una se evalúa independientemente de la otra. La combinación de construcciones del mismo nivel no se aplica a las construcciones *Switch/*Case .
Las directivas *Switch y *Construct nunca aparecen en la instantánea, por lo que, en la instantánea, las entradas secundarias de la construcción *Caseaparecen como las entradas secundarias del elemento primario de la construcción *Switch .
En el ejemplo de código siguiente, se define un parámetro Today para que tarde días de la semana. En el ejemplo se muestran dos construcciones del mismo nivel *Switch/*Case ; ambas se evaluarán de forma independiente.
*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
}
}
}
Si la configuración especifica Today: Saturday
, la instantánea contendrá el código siguiente.
*Schedule:
{
*Eat: Breakfast, Dinner
*ToDo: Ballgame
}
Si la configuración especifica Today: Wednesday
, la instantánea contendrá el código siguiente.
*Schedule:
{
*Eat: Lunch
*ToDo: FixBugs
}
Si la configuración especifica Today: Tuesday
, la instantánea contendrá el código siguiente.
*Schedule:
{
*ToDo: FixBugs
}
En el ejemplo de código siguiente se muestran dos construcciones *Switch/*Case anidadas.
*Schedule:
{
*Switch: Today
{
*Case: Sunday
{
*Switch: Weather
{
*Case: Sunny
{
*ToDo: Garden
}
*Case: Cloudy
{
*ToDo: Laundry
}
}
}
*Case: Saturday
{
*ToDo: Ballgame
}
*Default:
{
*ToDo: FixBugs
}
}
}