Python のコードは テキスト ですが、そのままではコンピュータには理解できません。そこで、Python インタプリタはコードを プログラムとして解釈できる形 に変換しながら実行します。その最初のステップが 字句解析 (Lexical Analysis) です。
この記事では、Python 3.13 の 字句解析 について、初心者でも理解しやすいように ハンズオン形式 で解説していきます!
1. 字句解析とは?
字句解析の主な役割は以下のとおりです。
✅ コードを トークン (Token) に分解する
✅ どのトークンが キーワード なのか、識別子 なのかを認識する
✅ 文字列や数値、演算子などを分類する
つまり、Python のコードを「意味のある単位」に分割し、それぞれの要素が何なのかを識別する作業ですね。
2. 字句解析の流れ
Python のコードが実行されると、以下の手順で字句解析が行われます。
- コードを文字単位で読む
- トークン (Token) に分解する
- 識別子やキーワード、演算子などを認識する
- 構文解析 (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)→10や5は 数値リテラル
このように、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 の 字句解析 を理解すると、構文エラーの原因を見つけたり、コード解析ツールを作ったりするのに役立ちます! 💡
