web-dev-qa-db-ja.com

pythonインタプリタがコードブロックを認識する方法

Pythonの最も珍しい側面は、空白が重要であることです
ブロック区切り文字(C言語ファミリでは中括弧→ "{}")の代わりに、ブロックの開始位置と終了位置を示すためにインデントが使用されます。
どのようにpythonインタプリタがコードブロックを認識することができますか?

2
AminM

Pythonドキュメント、字句解析のセクションで、簡単に説明します インデント解析の仕組み 。簡単に説明すると、トークナイザーは、コードのブロックの開始位置と終了位置を決定する際のパーサー。これらのトークンは(おおよそ){および} Cのような言語のトークン。

11
Greg Hewgill

空白はインタプリタにとって単なる別の文字として表示されることに注意してください。

  • タブはASCIIでは0x09です。
  • スペースはASCIIでは0x20です

インタープリターは、事前定義されたルールをトリガーするパターンマッチャーに過ぎません。

8
user53019

パーサーレベルでは、それほど難しくありません。パーサーには、現在のブロックのインデントレベルを追跡するための変数が必要です。そして、新しい行を読むときは、先行スペース(またはタブ)を数え、その値を現在のブロックのインデントと比較してから、次のようなアルゴリズムを適用します。

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
2
Mason Wheeler
  • インデントが増えるとブロックが始まります。
  • インデントが減少すると、ブロックが終了します。
  • 同じ減少で複数のブロックを閉じることができます。
  • ブロックは入れ子にすることができます。
  • 同じインデントの深さの順次ブロックが結合します。
1
Vatine