我在python中实现了一个基于生成器的扫描器,它将字符串标记为形式的元组(标记类型、标记值):
for token in scan("a(b)"):
print token
将打印
("literal", "a")
("l_paren", "(")
...
下一个任务意味着要分析令牌流,为此,我需要能够从当前的令牌流中向前看一个项目,而不需要向前移动指针。迭代器和生成器不会一次提供完整的项序列,但根据需要,每个项都会使lookaheads与列表相比更加复杂,因为除非调用了
__next__()
否则下一个项是未知的。基于生成器的lookahead的简单实现是什么样子的?目前我正在使用一个变通方法,它意味着要从生成器中列出一个列表:
token_list = [token for token in scan(string)]
这样,lookahead就很容易实现了:
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
当然,这很管用。但考虑到这一点,我的第二个问题出现了:首先是否真的有一点需要制造一个生成器?
最佳答案
您可以编写一个包装器来缓冲生成器中的一些项目,并提供lookahead()函数来查看这些缓冲的项目:
class Lookahead:
def __init__(self, iter):
self.iter = iter
self.buffer = []
def __iter__(self):
return self
def next(self):
if self.buffer:
return self.buffer.pop(0)
else:
return self.iter.next()
def lookahead(self, n):
"""Return an item n entries ahead in the iteration."""
while n >= len(self.buffer):
try:
self.buffer.append(self.iter.next())
except StopIteration:
return None
return self.buffer[n]
关于python - 使用前瞻与发电机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1517862/