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