我正在用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()
方法,以便 it 成为接口。 Python返回类似
AttributeError: 'generator' object has no attribute 'type'
所以看来PLY需要一个一次返回一个令牌的方法。
有没有办法重写token()
方法,以便它返回scan()
的下一次迭代而不是那么慢?
答案 0 :(得分:0)
您需要将生成器保存在某处,例如:
def start(...):
self.lexer = self.scan()
def token(...):
return next(self.lexer)
免责声明:我对PLY一无所知。