我在 Python 中实现了一个基于生成器的扫描器,它将字符串标记为形式为(token type, token value)的元组:
for token in scan("a(b)"):
print token
会打印
("literal", "a")
("l_paren", "(")
...
下一个任务意味着解析令牌流,为此,我需要能够在不向前移动指针的情况下从当前项目向前看一个项目。迭代器和生成器不会一次提供完整的项目序列,而是根据需要提供每个项目,这一事实使得前瞻与列表相比有点棘手,因为除非__next__()
调用下一个项目,否则不知道下一个项目。
基于生成器的前瞻的简单实现是什么样的?目前我正在使用一种解决方法,这意味着从生成器中列出一个列表:
token_list = [token for token in scan(string)]
然后,可以通过以下方式轻松实现前瞻:
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
当然,这很好用。scan()
但是考虑到这一点,我的第二个问题出现了:首先制造发电机真的有意义吗?