当前位置:   article > 正文

python tokenize_Python语法处理(1)——Tokenizer

parser/tokenizer.c",line 499:error #2029: expected an expression _py_identi

今天主要来看Token和tokenizer。 主要涉及Parser文件夹下的token.c,tokenizer.c,tokenizer.h。

前排提醒:不要学Python这么写Tokenizer。至少不要像Python的这个一样goto和hack满天飞。

Python在实现自己的Parser时并没有使用类似flex或lex之类的词法检查生成器,以及yacc或bison之类的LALR Parser 生成器,而是选择自己写了一个tokenizer和自己的一个LL(1) Parser。这篇文章的重点在Tokenizer。

在第一篇文章里提到了Grammar的替换,其实token.c就是利用Grammar/Tokens和Tools/scripts/generate_token.py生成出来的,主要处理那些特殊符号和操作符。

但剩余的词法规则几乎都是靠tokenizer.c手工写成的。

相较于传统的编译器前端的tokenizer,python的tokenizer有一些别的作用,比如检查文件编码,编码内部转换等。主要也是因为支持UTF-8,UTF-16等编码,这些编码检查也是错误处理的一部分。

真正进入tokenizer的部分,首先会看到struct tok_state,具体定义在tokenizer.h中。可以看到其主要部分有:Buffer相关,包括当前位置,buffer终点,buffer内容终点,如果来源是文件的话还有文件指针等等

当前状态,包括错误状态,缩进层数,括号层数,行号等等

交互模式下的提示符

编码相关

async相关

有一说一,你个tokenizer保留async的状态有

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/354842
推荐阅读
相关标签
  

闽ICP备14008679号