我在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/

10-10 04:00