Pythonの最も珍しい側面は、空白が重要であることです
ブロック区切り文字(C言語ファミリでは中括弧→ "{}")の代わりに、ブロックの開始位置と終了位置を示すためにインデントが使用されます。
どのようにpythonインタプリタがコードブロックを認識することができますか?
Pythonドキュメント、字句解析のセクションで、簡単に説明します インデント解析の仕組み 。簡単に説明すると、トークナイザーは、コードのブロックの開始位置と終了位置を決定する際のパーサー。これらのトークンは(おおよそ){
および}
Cのような言語のトークン。
空白はインタプリタにとって単なる別の文字として表示されることに注意してください。
インタープリターは、事前定義されたルールをトリガーするパターンマッチャーに過ぎません。
パーサーレベルでは、それほど難しくありません。パーサーには、現在のブロックのインデントレベルを追跡するための変数が必要です。そして、新しい行を読むときは、先行スペース(またはタブ)を数え、その値を現在のブロックのインデントと比較してから、次のようなアルゴリズムを適用します。
if currentIndent = currentBlock.indent then
parse line in the context of currentBlock
else if currentIndent > currentBlock.indent then
create sub-block of currentBlock and parse line in that context
else finish currentBlock and run this same comparison on currentBlock.parent