switch (expr) block;
Branch to the case label in statement that matches expr.
If no matching case label is found (by value or by type),
branch to the default label in statement.
A case label has the form
case expr_n :
where expr_n must be constant, or the form
case expr_n1 .. expr_n2 :
where expr_n1 and expr_n2 must be numeric constants and
expr_n1 < expr_n2.
Either all case labels have to be strings or all have to be
numeric. Only 0 is special: it is allowed in a switch
statement where all other labels are strings.
A default label has the form
The default label defaults to the end of statement if not
Whenever a 'break' statement is executed inside 'statement' a
branch to the end of the switch statement is performed.
case 0 .. 22 : write("Nothing happens"); break;
case 23 .. 27 :
write("You are surrounded by a golden glow");
case 28 .. 32 :
write("The water was poisoned!\n");
case 33 : write("You hear a voice whispering: "+random_hint());
/* fall through */
case 34 :
write("While you didn't paid attention, a water demon snatches\n"
"a coin out of your purse!\n");
default : write "You hear some strange noises\n"; break;
case 42 : return;
case 99 : write("It tastes good.\n";
In C, the grammar for switch() is
switch (expr) block
allowing constructs like
case 1: ...
case 2: ...
The LPC compiler currently can't handle neither statements as switch
body, nor case labels embedded in inner loops.
LDMud 3.2.9/3.3 allowed to pass values of the wrong type to switch(),
the driver would in that case use the default case. Before, values
of the wrong type caused a runtime error.
LDMud 3.2.10 constrained the grammar to require a block for the
switch() body, not just a statement. This differs from the C
syntax, but was necessary as the compiler didn't handle
the statement case correctly.
for(LPC), foreach(LPC), do-while(LPC), if(LPC), while(LPC)