【发布时间】:2020-10-18 14:13:01
【问题描述】:
我在 python 中创建了一个类,它将代码流拆分为令牌并逐个令牌推进以使用它们
import re
class Tokenizer:
def __init__(self, input_file):
self.in_file = input_file
self.tokens = []
self.current_token = None
self.next_token = None
self.line = 1
def split_tokens(self):
''' Create a list with all the tokens of the input file '''
self.tokens = re.findall("\w+|[{}()\[\].;,+\-*/&|<>=~\n]", self.in_file)
def __iter__(self):
for token in self.tokens:
if token != '\n':
yield token
else:
self.line += 1
def advance(self):
self.current_token = self.next_token
self.next_token = next(self.__iter__())
初始化后:
text = 'constructor SquareGame03 new()\n\
{let square=square;\n\
let direction=direction;\n\
return square;\n\
}'
t = Tokenizer(text)
t.split_tokens()
t.advance()
如果我打印令牌似乎可以工作
print(t.current_token, t.next_token)
None constructor
但是对 advance 方法的所有其他调用都会给出这些结果:
t.advance()
print(t.current_token, t.next_token)
constructor constructor
t.advance()
print(t.current_token, t.next_token)
constructor constructor
所以它没有进步,我不明白为什么。
【问题讨论】:
-
每次调用
advance()都是从__iter__()创建新的生成器,它从头开始。所以你会得到相同的结果。 -
哦,谢谢,我想我修好了。将函数 iter 分配给变量 ex。 a = t.__iter__() 然后使用 next(a) 似乎有效