Python 如何为手写lexer编写PLY接口?
我正在用Python编写一个编译器,我制作了一个手工编写的lexer,因为我不知道如何在PLY中解析缩进。另外,我的lexer使用了一些Python 如何为手写lexer编写PLY接口?,python,ply,Python,Ply,我正在用Python编写一个编译器,我制作了一个手工编写的lexer,因为我不知道如何在PLY中解析缩进。另外,我的lexer使用了一些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"
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解析器需要一个标记方法,因此我制作了一个如下所示的方法:
def token(self):
return next(self.scan())
根据我的测试,使用scan()。我的token()
方法似乎有问题
此外,我还尝试重命名scan()
方法,以便它可以成为接口。Python返回类似于
AttributeError: 'generator' object has no attribute 'type'
因此,PLY似乎需要一种每次返回单个令牌的方法
有没有办法重写token()
方法,使其返回scan()
的下一次迭代,并且不会那么慢?您需要将生成器保存在某个地方,例如:
def start(...):
self.lexer = self.scan()
def token(...):
return next(self.lexer)
免责声明:我对PLY一无所知。顺便说一句,即使您想解析缩进,也可以将PLY用于大多数词法分析。只需通过lexer携带所有(前导?)空格换行符,并对令牌流进行后处理,以插入适当的缩进/删除令牌。当我这样做时,我没有使用PLY进行解析步骤,因此我不必集成它,因此无法回答这个问题。但是它确实使编写lexer变得更容易,这可能会起作用,但我也不知道如何为一个规则返回多个标记来处理缩进。剩下的我已经可以编写了。它可以工作了,但它肯定会让程序运行得慢一些,大约5毫秒。但这并不真正困扰我。谢谢