在编程中,Token(令牌)是指代码解析或处理过程中的最小语义单元。它是编译器、解释器或文本分析工具(如正则表达式、词法分析器)处理源代码时的基本单位。
1. Token 在代码解析中的作用
当程序被编译或解释时,源代码首先会被分解成一系列的 Token,然后再进行语法分析(Parsing)。这个过程称为 词法分析(Lexical Analysis),由 词法分析器(Lexer/Tokenizer) 完成。
示例:代码如何被分解成 Token?
if x > 5:
print("Hello")
这段代码会被拆解成以下 Token(不同语言/工具可能有细微差异):
Token 类型 | 值 |
---|---|
关键字 | if |
标识符 | x |
运算符 | > |
数字 | 5 |
冒号 | : |
缩进 | |
函数名 | print |
左括号 | ( |
字符串 | "Hello" |
右括号 | ) |
2. Token 的常见类型
不同编程语言的 Token 分类可能略有不同,但通常包括以下几种:
Token 类型 | 示例 | 说明 |
---|---|---|
关键字(Keywords) | if , for , return | 语言保留的特殊单词,有固定含义 |
标识符(Identifiers) | x , myVar , calculate_sum | 变量名、函数名等用户定义的名称 |
字面量(Literals) | 42 , 3.14 , "hello" | 直接表示值的常量(数字、字符串等) |
运算符(Operators) | + , - , = , == | 用于数学或逻辑运算的符号 |
分隔符(Delimiters) | ( , ) , { , } , , | 用于代码块、参数列表等的边界符号 |
注释(Comments) | // comment , /* ... */ | 被编译器忽略的说明性文字 |
空白符(Whitespace) | 空格 、换行 \n 、制表符 \t | 通常被忽略,但在 Python 等语言中影响缩进 |
3. Token 的应用场景
(1) 编译器/解释器的工作流程
-
词法分析(Lexical Analysis):源代码 → Tokens
-
语法分析(Parsing):Tokens → 抽象语法树(AST)
-
代码生成/执行:AST → 机器码/字节码/直接执行
(2) 正则表达式(Regex)
正则表达式引擎在处理文本时,也会按模式匹配 Token,例如:
\d+ # \d 是一个 Token(匹配数字),+ 是另一个 Token(表示重复)
[a-z] # [ 和 ] 是 Token,a-z 是字符范围 Token
(3) 模板引擎(如 Jinja2、Mustache)
{{ user.name }} # {{ 和 }} 是 Token,`user.name` 是变量 Token
(4) 命令行参数解析(如 argparse
)
ls -l /home # `ls`、`-l`、`/home` 都是不同的 Token
4. 如何手动实现一个简单的 Tokenizer?
以 Python 为例,我们可以用正则表达式实现一个简单的词法分析器:
import re
# 定义 Token 规则
token_specs = [
('NUMBER', r'\d+'), # 数字
('STRING', r'"[^"]*"'), # 字符串
('IDENTIFIER', r'[a-zA-Z_]\w*'), # 变量名
('OPERATOR', r'[+\-*/=]'), # 运算符
('WHITESPACE', r'\s+'), # 空白符(忽略)
]
def tokenize(code):
tokens = []
for tok_type, pattern in token_specs:
for match in re.finditer(pattern, code):
if tok_type != 'WHITESPACE': # 忽略空格
tokens.append((tok_type, match.group()))
return tokens
code = 'x = 10 + "hello"'
print(tokenize(code))
输出:
[
('IDENTIFIER', 'x'),
('OPERATOR', '='),
('NUMBER', '10'),
('OPERATOR', '+'),
('STRING', '"hello"')
]
5. 总结
-
Token 是代码的最小语义单元,如关键字、变量名、运算符等。
-
词法分析器(Lexer) 负责将源代码拆分成 Token。
-
编译器/解释器 依赖 Token 进行后续的语法分析(Parsing)。
-
正则表达式、模板引擎、命令行解析 等场景也广泛使用 Token 概念。