Skip to main content
 首页 » 编程设计

python之如何为手写词法分析器编写 PLY 接口(interface)

2025年05月04日13zhujiabin

我正在用 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() 方法,以便它 可以成为接口(interface)。 Python 返回类似的东西

AttributeError: 'generator' object has no attribute 'type' 

因此看来 PLY 需要一种一次返回单个标记的方法。

有什么方法可以重写 token() 方法,使其返回 scan() 的下一次迭代而不是那么慢吗?

请您参考如下方法:

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

def start(...): 
   self.lexer = self.scan() 
 
def token(...): 
    return next(self.lexer) 

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