2

我正在用 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()而不是那么慢?

4

1 回答 1

1

您需要将生成器保存在某处,例如:

def start(...):
   self.lexer = self.scan()

def token(...):
    return next(self.lexer)

免责声明:我对 PLY 一无所知。

于 2012-03-31T17:07:35.857 回答