aboutsummaryrefslogtreecommitdiff
path: root/language/statements/structure.rst
blob: 1a412af9c184d687c92d3364f7aa754d1d3f5bd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Structure Statements
^^^^^^^^^^^^^^^^^^^^

.. crowbar:element:: StructureStatement <- IfStatement / SwitchStatement / WhileStatement / DoWhileStatement / ForStatement

    A structure statement creates some nonlinear control structure.
    There are several types of these structures.

.. crowbar:element:: IfStatement <- 'if' '(' Expression ')' Block ('else' Block)?

    An if statement allows some action to be performed only sometimes, based on the value of the expression.

    Compile-time Behavior:

    If the expression does not have type bool, the compiler must emit an error.

    Runtime Behavior:

    First, the expression is evaluated.
    If the expression evaluates to a ``bool`` value of ``true``, then the first block will be executed.
    If the expression evaluates to a ``bool`` value of ``false``, either the second block is executed or nothing is executed.

.. crowbar.element.. SwitchStatement <- 'switch' '(' Expression ')' '{' (CaseSpecifier / Statement)+ '}'
                     CaseSpecifier <- 'case' Expression ':' / 'default' ':'

    A switch statement allows many different actions to be taken depending on the value of some expression.

    Compile-time Behavior:

    The expression must have a type which is either some integer type or an enum.
    The expression in a case specifier must have a value which can always be known at compile time, i.e. its value must be a constant or computed from only constants.
    Either there must be a case specifier for every valid value in the type of the switch expression, or there must be a default case specifier.
    At most one default case may be present.

    Runtime Behavior:

    First, the switch expression is evaluated.
    Whichever case specifier has the same value, or the default case specifier if none is found, is then selected as the matching case specifier.
    Any case specifiers immediately following the matching case specifier is ignored.
    Subsequent statements are then executed, in linear order, until another case specifier is reached.
    The execution of the switch statement then ends.