最近在看《Crafting Interpreters》,梳理了一下 lexeme 和 token。
lexeme
定义
源代码中的"连续字符序列"。
示例
a = 1
sum = a + 2
上面两行代码总共包含 8 个 lexeme: a = 1 sum = a + 2。
token
定义
将 lexeme 分类并附加一些额外的属性就得到 token。根据定义,token 包含两部分:类别(token type, 如:IDENTIFIER, STRING, NUMBER... )和可选属性(如:lexeme, literal, line)
示例
a = 1
sum = a + 2
上面两行代码总共包含 8 个 token: a = 1 sum = a + 2。
class Token:
# 这里的 literal Java 里面用的类型是 Object, Python 里面类型注解暂时用 Any
def __init__(self, token_type: TokenType, lexeme: str, literal: Any, line: int) -> None:
self.token_type = token_type
self.lexeme = lexeme
self.literal = literal
self.line = line
def __str__(self) -> str:
return f'{self.token_type} {self.lexeme} {self.literal} {self.line}'
假设 token 的定义如上,那么 第一个 token a 的 token_type 为 identifier, lexeme 为 "a", literal 为 "a", line(行号) 为 1。
欢迎搜索及关注:编程人(a_codists)