牛骨文教育服务平台(让学习变的简单)

4.19 其他问题

  • 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属性。