赞
踩
今天主要来看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的状态有
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。