Statements ---------- .. crowbar:element:: 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. .. crowbar:element:: Statement <- VariableDefinition / StructureStatement / FlowControlStatement / AssignmentStatement / FragileStatement / ExpressionStatement / EmptyStatement Crowbar has many different types of statement. .. crowbar:element:: EmptyStatement <- ';' Compile-time Behavior: None. Runtime Behavior: None. .. crowbar:element:: 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. .. crowbar:element:: 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. .. toctree:: :maxdepth: 1 variables structure flow-control assignment