# 4.6. Statements¶

Block <- '{' Statement* '}'

Compile-time Behavior:

A block is a possibly-empty sequence of statements surrounded by curly braces. Any declaration or definition within the block must not be visible outside of the block.

Runtime Behavior:

When a block is executed, each of the containing statements, in linear order, is executed.

Statement <- VariableDefinition / StructureStatement / FlowControlStatement / AssignmentStatement / FragileStatement / ExpressionStatement / EmptyStatement

Crowbar has many different types of statement.

EmptyStatement <- ';'

Compile-time Behavior:

None.

Runtime Behavior:

None.

FragileStatement <- 'fragile' Statement

Some behaviors are difficult to ensure the robustness of at compile time, and these behaviors are defined in this specification as fragile. Fragile behaviors used outside of fragile statements should produce a compiler error.

Compile-time Behavior:

Fragile behaviors used inside a fragile statement must not produce a compiler error for their fragility. Nesting fragile statements should produce a compiler error.

Runtime Behavior:

The contained statement is executed.

ExpressionStatement <- Expression ';'

Compile-time Behavior:

If the expression is not a function call, the compiler may emit a warning.

Runtime Behavior:

The expression is evaluated and the resulting value is discarded. Function calls must be fully evaluated, but expressions that are not function calls may be optimized out.