Token
token 类型与正则
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.parser.text.Token |
| 行数 | 67 |
TokenType 枚举的关键成员
public static final EnumSet<TokenType> EXCEPTIONS =
EnumSet.of(FUNC_TAIL, ARGS_HEAD, ARGS_SEPARATOR, ARGS_TAIL); // :20
⚠️ 字段名 EXCEPTIONS 有歧义:它列的不是「异常 token」,
而是 TextParser 里不需要产生值的控制类 token
(函数尾部、参数头、参数分隔符、参数尾部)。
命名与语义相反,容易误读。
从这 4 个名字可推断文本语法的 token 分类:
| 类别 | 含义 |
|---|---|
FUNC_TAIL |
函数名结束 |
ARGS_HEAD |
参数区开始 |
ARGS_SEPARATOR |
参数分隔 |
ARGS_TAIL |
参数区结束 |
⚠️ 这 4 个常量只出现这一处,
TextParser 里通过 TokenType 间接引用,
未直接按名比较 —— 具体判定逻辑在 values / valuesTail / value 三方法内。
getPattern(:27-35)
每个 TokenType 覆写 getPattern() 返回自己的 Pattern。
Tokenizer 用它做最长匹配。
⚠️ 用正则而非手写扫描器做词法,
意味着每个 token 都要编译/执行一次正则;
而 Tokenizer.tokenize 声明 throws Exception ——
Pattern.compile 与 Matcher 的异常都在这条路径上。
构造与访问器
| 成员 | 行 | 说明 |
|---|---|---|
Token(String lexem, Location start, Location end, TokenType type) |
:37 |
四参构造 |
getLexem() |
:56 |
字面量文本 |
getType() |
:60 |
token 类型 |
isEof() |
:64 |
是否文件结束标记 |
⚠️ 构造器不校验 lexem 与 type 是否匹配 ——
getPattern() 的正则与实际字面量的一致性由 Tokenizer 保证。
⚠️ 没有 equals / hashCode 覆写 ——
若 token 被放进 Set 或作 Map 键,会退化为引用比较。
TextParser 只做顺序遍历,未用作集合元素,所以无实际影响。
toString(:45-54)
[Token] 'lexem' 形式,用于错误信息。
相关
- Tokenizer - 唯一调用方
- Location - start / end 位置
- TextParser - token 的消费者