我正在用 Python 编写一个编译器,并且我制作了一个手写的词法分析器,因为我不知道如何在 PLY 中解析缩进。另外,我的词法分析器使用了一些yield
这样的语句:
def scan():
...
for i in tokens:
if i[0]: yield Token(self.line, i[0] if i[0] in keywords else "ident", i[0])
elif i[1]:
if "e" in i[1]:
base, exp = i[1].split("e")
val = float(base) * 10 ** int(exp)
else: val = float(i[1])
yield Token(self.line, "float", val)
... other cases ...
然而,我意识到 PLY 解析器需要一个token
方法,所以我做了一个看起来像这样的方法:
def token(self):
return next(self.scan())
根据我的测试,实际扫描使用scan()
平均需要 124 毫秒,但是当我使用 PLY 解析器时,几分钟后解析不会开始。看来我的token()
方法有问题。
另外,我尝试重命名该scan()
方法,以便它可以成为接口。Python返回类似的东西
AttributeError: 'generator' object has no attribute 'type'
因此,PLY 似乎需要一种一次返回单个令牌的方法。
有没有办法重写该token()
方法,以便它返回下一次迭代scan()
而不是那么慢?