【发布时间】:2019-07-31 06:27:55
【问题描述】:
我看到了https://docs.python.org/3/reference/grammar.html的文件
但我无法理解NAME的定义。
NAME的定义是什么?
也许,NAME 是开头字母或 _ 和结构化字母和数字以及 _。
【问题讨论】:
-
这只是你在python中给出的函数/参数/变量的名称
标签: python python-3.x grammar
我看到了https://docs.python.org/3/reference/grammar.html的文件
但我无法理解NAME的定义。
NAME的定义是什么?
也许,NAME 是开头字母或 _ 和结构化字母和数字以及 _。
【问题讨论】:
标签: python python-3.x grammar
如果您的问题是“如何在 python 中定义名称”(成为名称必须遵循的规则),那么答案是here:
identifier ::= xid_start xid_continue*
id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, > the underscore, and characters with the Other_ID_Start property>
id_continue ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*">
【讨论】:
次表面函数的标记化?
(以下复制自另一篇文章:How is the Python grammar used internally?)
当您使用一种语言编写程序时,您的解释器/编译器要从字符序列转换为实际操作,首先要做的就是将该字符序列翻译成更复杂的结构。为此,首先它将您的程序分成一系列标记,表达每个“单词”所代表的内容。例如,构造
if foo == 3: print 'hello'
会被转换成
1,0-1,2: NAME 'if'
1,3-1,6: NAME 'foo'
1,7-1,9: OP '=='
1,10-1,11: NUMBER '3'
1,11-1,12: OP ':'
1,13-1,18: NAME 'print'
1,19-1,26: STRING "'hello'"
2,0-2,0: ENDMARKER ''
但请注意,即使是“if if if”之类的内容也正确地制成了标记
1,0-1,2: NAME 'if'
1,3-1,5: NAME 'if'
1,6-1,8: NAME 'if'
1,9-1,11: NAME 'if'
2,0-2,0: ENDMARKER ''
标记化之后是解析为更高级别的结构,该结构分析标记是否真的合在一起有意义,后一个示例没有,但第一个示例可以。为此,解析器必须识别标记的实际含义(例如,if 是关键字,而 foo 是变量),然后从标记中构建一棵树,将它们组织成层次结构,并查看这个层次结构是否真的使感觉。这就是您所看到的语法的来源。该语法在 BNF 中,这是一种表示语言可以识别的结构的符号。该语法由一个程序(例如,bison)消化,该程序具有获取该语法并生成实际的 C 代码的神奇属性,这些代码为您完成繁重的工作,通常是通过识别标记,组织它们,返回一个解析树,或者告诉你哪里出错了。
简短版:开发一种语言是关于定义标记以及如何将这些标记组合在一起以提供有意义的东西。这是通过语法完成的,您可以使用该语法通过自动化工具生成实际的“解析器”代码。
【讨论】: