Python3官方语法规范中的NAME具体指什么?
Python3语法规范中
NAME的具体定义 你在官方语法文档中反复看到的NAME,本质是词法分析(lexer)环节输出的基础token类型,不是语法解析器定义的非终结符。它的核心作用是统一指代所有符合Python标识符构成规则的字符序列对应的词法单元——所有语法规则里需要独立名称占位的位置(比如变量名、类名、模块名、函数名),都会用NAME来做占位说明。
NAME的具体匹配规则
这类token的匹配标准和Python的合法标识符构成要求完全对齐,具体规则为:
- 名称的第一个字符,必须是Python认可的Unicode字母类字符:包含大小写英文字母、下划线
_,以及中文、希腊字母等所有被Unicode归类为“字母”的多语言字符 - 名称后续的字符,可以是上述字母类字符、Unicode数字、以及Unicode归类为“连接符”的字符(最常见的就是下划线)
容易踩的认知误区
对于lexer开发者来说,两个关于
NAME的误区非常容易踩坑:
NAME不等同于“用户自定义的非保留字标识符”。lexer的常规扫描逻辑是:先把所有符合标识符构成规则的字符串临时标记为NAME候选,再通过内置保留字表做二次区分,把属于Python关键字(比如if、def、lambda)的候选标记为对应的关键字token。也就是说,所有Python关键字的字符构成,本身完全符合NAME的匹配规则,只是因为语义上被保留,才会在后续流程中被拆为独立token类型。NAME的定义不做语义层面的限制。语法规则里用NAME只代表这个位置必须放一个符合名称构成的词法单元,不代表放任何NAME类型的token都符合语法要求——比如你不能在需要写变量名的位置放一个保留关键字,这属于parser阶段的校验逻辑,和NAME本身的词法定义无关。
示例规则说明
回到你提到的dotted_name语法规则:
dotted_name: | dotted_name '.' NAME | NAME
这条规则的实际语义是,点分的路径式名称(比如os.path、my_project.utils.Logger),本质就是由点号分隔的连续NAME序列构成,每个被点分割的片段,都是lexer扫描后输出的NAME类token。
给做lexer贡献的小提示:实现NAME匹配逻辑时,不要只依赖[a-zA-Z_][a-zA-Z0-9_]*这类老式正则,需要对齐Python3当前版本支持的全量Unicode标识符匹配规则,否则会出现多语言合法标识符识别错误的问题。
内容的提问来源于stack exchange,提问作者Aidan Do
相关产品推荐
相关产品推荐

