Я реализовал на Python сканер с генератором, который токенизирует строку в кортежей формы (тип токена, значение токена):
for token in scan("a(b)"):
print token
будет печатать
("literal", "a")
("l_paren", "(")
...
Следующая задача подразумевает анализ потока токенов, и для этого мне нужно иметь возможность искать один элемент вперед от текущего, не перемещая указатель вперед. Тот факт, что итераторы и генераторы не обеспечивают полную последовательность элементов одновременно, но каждый элемент по мере необходимости делает взгляды немного более сложными по сравнению с списками, поскольку следующий элемент не известен, если не вызывается __next__()
.
Что может показаться простой реализацией основанного на генераторе lookahead? В настоящее время я использую обходное решение, которое подразумевает создание списка из генератора:
token_list = [token for token in scan(string)]
Теперь вид легко реализуется примерно так:
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
Конечно, это просто отлично работает. Но, думая, что мой второй вопрос возникает: действительно ли возникает вопрос создания генератора scan()
в первую очередь?