文字列を形式(トークンの種類、トークンの値)のタプルにトークン化するジェネレーター ベースのスキャナーを Python に実装しました。
for token in scan("a(b)"):
print token
印刷します
("literal", "a")
("l_paren", "(")
...
次のタスクは、トークン ストリームの解析を意味します。そのためには、ポインターを先に動かさずに、現在のアイテムから 1 つ先のアイテムを参照できるようにする必要があります。イテレーターとジェネレーターはアイテムの完全なシーケンスを一度に提供するのではなく、必要に応じて各アイテムを提供するという事実は、次のアイテム__next__()
が呼び出されない限り、リストと比較して先読みを少しトリッキーにします。
ジェネレーターベースの先読みの簡単な実装はどのようになりますか? 現在、ジェネレーターからリストを作成することを意味する回避策を使用しています。
token_list = [token for token in scan(string)]
先読みは、次のようなもので簡単に実装できます。
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
もちろん、これだけでうまくいきます。scan()
しかし、それを考えると、私の 2 番目の疑問が生じます。そもそもジェネレーターを作成する意味は本当にあるのでしょうか?