#
7 複合文 (compound statement)

複合文には、他の文 (のグループ) が入ります; 複合文は、中に入っている 他の文の実行の制御に何らかのやり方で影響を及ぼします。 一般的には、複合文は複数行にまたがって書かれますが、 全部の文を一行に連ねた単純な書き方もあります。

`if`、`while` 、および `for` 文は、 伝統的な制御フロー構成を実現します。`try` は例外処理 かつ/または一連の文に対するクリーンアップコードを指定します。 関数とクラス定義もまた、構文法的には複合文です。

複合文は、一つまたはそれ以上の `節 (clause)' からなります。 一つの節は、ヘッダと `スイート (suite)' からなります。 特定の複合文を構成する節のヘッダ部分は、全て同じインデント レベルになります。各々の節ヘッダ行は一意に識別されるキーワード から始まり、コロンで終わります。スイートは、ヘッダのコロンの後ろに セミコロンで区切られた一つまたはそれ以上の単純文を並べるか、 ヘッダ行後のインデントされた文の集まりです。 後者の形式のスイートに限り、ネストされた複合文を入れることが できます; 以下の文は、`else` 節がどの `if` 節 に属するかがはっきりしないという理由から不正になります:

    if test1: if test2: print x

また、このコンテキスト中では、セミコロンはコロンよりも強い結合を 表すことにも注意してください。従って、以下の例では、`print` は全て実行されるか、されないかのどちらかです:

    if x < y < z: print x; print y; print z

まとめると、以下のようになります:

  compound_stmt | ::= | if_stmt
  |  | `| while_stmt`
  |  | `| for_stmt`
  |  | `| try_stmt`
  |  | `| with_stmt`
  |  | `| funcdef`
  |  | `| classdef`
  suite | ::= | stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
  statement | ::= | stmt_list NEWLINE | compound_stmt
  stmt_list | ::= | simple_stmt (";" simple_stmt)* [";"]

  Download entire grammar as text.

文は常に `NEWLINE` か、その後に `DEDENT` が続いたもので終了することに注意してください。 また、オプションの継続節は常にあるキーワード から始まり、このキーワードから複合文を開始することはできないため、 曖昧さは存在しないことにも注意してください (Python では、 `ぶら下がり(dangling) `else`' 問題を、ネストされた `if` 文はインデントさせること解決しています)。

以下の節における文法規則の記述方式は、明確さのために、 各節を別々の行に書くようにしています。