Python 3.13 の字句解析をハンズオンで学ぼう!2

当サイトではアフィリエイト広告を利用しています。

リファレンス

Python のコードは テキスト ですが、そのままではコンピュータには理解できません。そこで、Python インタプリタはコードを プログラムとして解釈できる形 に変換しながら実行します。その最初のステップが 字句解析 (Lexical Analysis) です。

この記事では、Python 3.13 の 字句解析 について、初心者でも理解しやすいように ハンズオン形式 で解説していきます!


1. 字句解析とは?

字句解析の主な役割は以下のとおりです。

✅ コードを トークン (Token) に分解する
✅ どのトークンが キーワード なのか、識別子 なのかを認識する
✅ 文字列や数値、演算子などを分類する

つまり、Python のコードを「意味のある単位」に分割し、それぞれの要素が何なのかを識別する作業ですね。


2. 字句解析の流れ

Python のコードが実行されると、以下の手順で字句解析が行われます。

  1. コードを文字単位で読む
  2. トークン (Token) に分解する
  3. 識別子やキーワード、演算子などを認識する
  4. 構文解析 (Parsing) に渡す

✨ 実例

たとえば、次のコードを字句解析するとどうなるでしょう?

x = 10 + 5

このコードを字句解析すると、以下のように分類されます。

コード トークンの種類
x 識別子 (変数名)
= 代入演算子
10 整数リテラル
+ 算術演算子
5 整数リテラル

3. ハンズオン:Python で字句解析を試す

Python には tokenize という標準ライブラリがあり、これを使うと 自分のコードがどのように字句解析されるのか を確認できます。

🏆 実験 1: tokenize を使ってトークンを表示

次のコードを実行してみましょう!

import tokenize
from io import BytesIO

code = b"x = 10 + 5"

# `tokenize.tokenize` にバイトストリームを渡す
tokens = tokenize.tokenize(BytesIO(code).readline)

for token in tokens:
    print(token)

🔍 出力例

TokenInfo(type=1 (NAME), string='x', ...)
TokenInfo(type=54 (OP), string='=', ...)
TokenInfo(type=2 (NUMBER), string='10', ...)
TokenInfo(type=54 (OP), string='+', ...)
TokenInfo(type=2 (NUMBER), string='5', ...)
...

📝 解説

  • type=1 (NAME)x識別子
  • type=54 (OP)=+演算子
  • type=2 (NUMBER)105数値リテラル

このように、Python はコードを細かい単位に分解し、それぞれの役割を認識しています。


4. Python の字句構造

Python のコードは、以下のような トークン (Token) で構成されています。

📌 主要なトークンの種類

種類
識別子 (Identifier) x, my_var, calculate_sum
キーワード (Keyword) if, def, return, class
リテラル (Literal) "Hello", 42, 3.14, True, None
演算子 (Operator) +, -, *, /, =
区切り記号 (Delimiter) (), {}, [], ,, :

🔹 実験 2: Python のキーワードを調べる

Python の 予約語 (Reserved Keywords)keyword モジュールを使って取得できます。

import keyword

print(keyword.kwlist)

⏩ 出力例

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', ...]

🚨 注意! これらのキーワードは 変数名として使えません!

if = 10  # ❌ SyntaxError: invalid syntax

5. コメントと空白

📝 Python のコメントは #

# これはコメントです
x = 10  # これもコメント

⚠️ 空白 (インデント) も重要!

def hello():
    print("Hello, World!")  # ✅ インデントが正しい

  print("This is wrong!")  # ❌ インデントエラー (IndentationError)

Python では インデント (空白の幅) が正しくないとエラーになります!


6. 文字列とエスケープシーケンス

Python では ' '" " で囲むと 文字列リテラル になります。

msg = "Hello, Python!"

エスケープシーケンスも覚えておきましょう!

print("改行\n次の行")  # \n で改行
print("タブ\tスペース")  # \t でタブ
print("バックスラッシュ \\")  # \ を表示

7. ハンズオン:ユーザー入力を解析する

最後に、ユーザーが入力した Python コードを 字句解析するプログラム を作ってみましょう!

import tokenize
from io import BytesIO

# ユーザー入力
code = input("Python コードを入力してください: ").encode()

# 字句解析
tokens = tokenize.tokenize(BytesIO(code).readline)

# 結果を表示
for token in tokens:
    print(f"種類: {token.type}, 値: {token.string}")

✨ 実行例

Python コードを入力してください: print("Hello, World!")
種類: 1, 値: print
種類: 54, 値: (
種類: 3, 値: "Hello, World!"
種類: 54, 値: )

まとめ

🔹 字句解析 (Lexical Analysis) とは、Python コードを トークン に分解する処理
🔹 tokenize モジュールを使うと 字句解析を確認できる
🔹 Python には キーワード・識別子・リテラル・演算子 などのトークンがある
🔹 コメントやインデントも字句解析の一部!
🔹 実際にユーザー入力を解析するプログラムを作成!

Python の 字句解析 を理解すると、構文エラーの原因を見つけたり、コード解析ツールを作ったりするのに役立ちます! 💡