如何为手写lexer编写PLY界面?

时间:2012-03-31 17:04:31

标签: python ply

我正在用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()的下一次迭代而不是那么慢?

1 个答案:

答案 0 :(得分:0)

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

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

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

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