4.19 其他问题
最后更新于:2022-04-01 01:10:11
* lexer需要输入的是一个字符串。好在大多数机器都有足够的内存,这很少导致性能的问题。这意味着,lexer现在还不能用来处理文件流或者socket流。这主要是受到re模块的限制。
* lexer支持用Unicode字符描述标记的匹配规则,也支持输入字串包含Unicode
* 如果你想要向`re.compile()`方法提供flag,使用reflags选项:lex.lex(reflags=re.UNICODE)
* 由于lexer是全部用Python写的,性能很大程度上取决于Python的re模块,即使已经尽可能的高效了。当接收极其大量的输入文件时表现并不尽人意。如果担忧性能,你可以升级到最新的Python,或者手工创建分析器,或者用C语言写lexer并做成扩展模块。
如果你要创建一个手写的词法分析器并计划用在yacc.py中,只需要满足下面的要求:
* 需要提供一个token()方法来返回下一个标记,如果没有可用的标记了,则返回None。
* token()方法必须返回一个tok对象,具有type和value属性。如果行号需要跟踪的话,标记还需要定义lineno属性。