标记
源代码中的字符流从左到右被划分为一系列标记,如下面的语法定义所示。
\[\begin{split}\begin{array}{llll} \def\mathdef3317#1{{}}\mathdef3317{token} & \href{../text/lexical.html#text-token}{\mathtt{token}} &::=& \href{../text/lexical.html#text-keyword}{\mathtt{keyword}} ~|~ \href{../text/values.html#text-int}{\def\mathdef3338#1{{\mathtt{u}#1}}\mathdef3338{N}} ~|~ \href{../text/values.html#text-int}{\def\mathdef3344#1{{\mathtt{s}#1}}\mathdef3344{N}} ~|~ \href{../text/values.html#text-float}{\def\mathdef3352#1{{\mathtt{f}#1}}\mathdef3352{N}} ~|~ \href{../text/values.html#text-string}{\mathtt{string}} ~|~ \href{../text/values.html#text-id}{\mathtt{id}} ~|~ \def\mathdef3360#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3360{(} ~|~ \def\mathdef3361#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3361{)} ~|~ \href{../text/lexical.html#text-reserved}{\mathtt{reserved}} \\ \def\mathdef3317#1{{}}\mathdef3317{keyword} & \href{../text/lexical.html#text-keyword}{\mathtt{keyword}} &::=& (\def\mathdef3362#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3362{a} ~|~ \dots ~|~ \def\mathdef3363#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3363{z})~\href{../text/values.html#text-idchar}{\mathtt{idchar}}^\ast \qquad (\mathrel{\mbox{if}}~\mbox{occurring as a literal terminal in the grammar}) \\ \def\mathdef3317#1{{}}\mathdef3317{reserved} & \href{../text/lexical.html#text-reserved}{\mathtt{reserved}} &::=& (\href{../text/values.html#text-idchar}{\mathtt{idchar}} ~|~ \href{../text/values.html#text-string}{\mathtt{string}})^+ \\ \end{array}\end{split}\]
标记根据最长匹配规则从输入字符流中形成。也就是说,下一个标记始终由词法语法识别的最长可能的字符序列组成。标记可以由空白分隔,但除了字符串之外,它们自身不能包含空白。
关键字标记是隐式定义的,即在终结符的字面形式中出现,例如 \(\def\mathdef3364#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3364{keyword}\),在本章的语法产生式中,或者在本章中出现的显式情况下。
任何不属于其他类别的标记都被视为保留标记,并且不能出现在源代码中。
注意
定义保留标记集的效果是,所有标记都必须由括号、空白或注释分隔。例如,\(\def\mathdef3365#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3365{0\$x}\) 是一个保留标记,\(\def\mathdef3366#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3366{"a""b"}\) 也是一个保留标记。因此,它们不被识别为两个单独的标记 \(\def\mathdef3367#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3367{0}\) 和 \(\def\mathdef3368#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3368{\$x}\),或分别为 \("a"\) 和 \("b"\),而是被禁止。标记化的这种属性不受保留标记的定义与其他标记类重叠这一事实的影响。
注释¶
注释可以是行注释,以双分号 \(\def\mathdef3337#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3337{{;}{;}}\) 开头,一直延伸到行末,也可以是块注释,用分隔符 \(\def\mathdef3335#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3335{{(}{;}} \dots \def\mathdef3336#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3336{{;}{)}}\) 括起来。块注释可以嵌套。
这里,伪标记 \(\mathtt{eof}\) 表示输入的结束。对 \(\href{../text/lexical.html#text-comment}{\mathtt{blockchar}}\) 产生式的前瞻限制使语法消歧,以便只允许块注释分隔符的良好括号用法。
注意
任何格式和控制字符都可以在注释中使用。