Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为手写lexer编写PLY接口?_Python_Ply - Fatal编程技术网

Python 如何为手写lexer编写PLY接口?

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"

我正在用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" 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毫秒。但这并不真正困扰我。谢谢