StreamTokenizer
参考:ASCII字符表
字符流的有效字符提取、串化或数值化是本类的目的。white space(空白字符)、alphabetic(字母——英文字母和特定范围字符)、numeric(数值)、string quote(引用字符串)和 comment character(注解字符流)是字符流处理的五个对象主题(这里翻译偏差有处理解对象主题范围)。StreamTokenizer是字符流的加强I/O类,以字符(32bits的int变量存储)为基本单元进行处理。以下表格围绕对象主题的值域、操作目等讨论StreamTokenizer的原理:
对象主题 | 值域(ASCII码 0-255) | 字符 | 操作目的 | 处理优先级 | 指定或可选、覆盖或兼有 |
---|---|---|---|---|---|
white space | 0 - 32 | ’ '以及其ASCII码前所有字符 | 掠过指定空白字符 | 1 | 可选且覆盖 |
alphabetic | 97-122和65-90和160-255 | [a-zA-Z]和160-255ASCII和其余十六个平面Unicode字符 | 解析字母串(连续字母的字符)。字符流必须以alphabetic字符开端,可包含numeric字符(ab12是字符串,12ab不是连续的字符串) | 3 | 可选且兼有 |
numeric | 48 - 57和48和45 即[0-9.-] | [0-9]和’.‘和’-’ | 解析数值。.和.1和1.1和-.和-.1和-1.1的形式都将作为数值处理 | 2 | 指定且兼有 |
string quote | 34和39 | ‘"‘和’\’’ | 解析引用字符串,引用字符由双引号或单引号标识,字符串内转义字符将被解析为字符 | 4 | 指定且覆盖 |
comment character | 47 | / | 略过注释行 | 5 | 指定且覆盖 |
StreamTokenizer类字段很多,源于其功能的多样性和复杂性。以下从功能角度,拆分出五个模块:
- ctype:character type。ASCII码在五种对象主题的归属
- CT_WHITESPACE:1,white space
- CT_DIGIT:2,numeric
- CT_ALPHA:4,alphabetic
- CT_QUOTE:8,string quote
- CT_COMMENT:16,comment character
- peekc:标记下一个处理的字符或方式。字符流的各个对象主题处理下,可能存在过度提取一个字符的情况,因此需要标记两种情况,以供下次对象主题处理的需要。
- 过度读取的unicode字符
- NEED_CHAR:需要提取下一个字符
- SKIP_LF:line feed - \r,指定过度提取的字符是\r,并告知若next character = '\n’则掠过再读取一次。
- nval和sval,提取结果。sval:字母串、字符串,String类型;nval:数值,double浮点数。
- ttype:token type。主要指各种对象主题下处理的成果。其也兼具CT_QUOTE对象主题下的算法功能的变量。
- TT_EOF:white space主题下读取至文末或主题执行前的文末已探明。
- TT_EOL:white space主题下搭配eolIsSignificantP或eolIsSignificantP标识的句末中断识别且返回。简单说,句末标识。
- TT_NOTHING:ttype默认值,表明未执行过字符流识别。其的存在源于部分算法的需求。
- TT_NUMBER:numeric主题下的正确数值提取的标识。
- TT_WORD:alphabetic主题下的标识(能进入主题就说明存在字母串)。
- 其他值:ctype[peekc]=0未标识主题,不纳入任何主题处理和结果赋值;peekc=‘-’,无意义的文本读取,其在numeric主题下明确无意义数值,不纳入结果处理,因此不要意图以’-'开头进入alphabetic主题。
- 主题执行可选中断策略:通过变量控制特定主题执行策略。
- eolIsSignificantP:white space主题下,对’\r’或’\n’的判断,是否结束此次主题执行。
- slashSlashCommentsP:comment character主题执行的//单行注释策略
- slashStarCommentsP:comment character主题执行的/*多行注释策略
- forceLower:alphabetic主题下sval赋值的小写化。
- pushedBack:这个比较特殊,一次性消费品,用于探知最近一次nextToken的ttype结果。
注:comment character由三种,//和/*需要有变量配合,但是’/'其单行注释固有的方式。