Lexical Format

Characters

The text format assigns meaning to source text, which consists of a sequence of characters. Characters are assumed to be represented as valid Unicode (Section 2.4) scalar values.

\[\begin{split}\begin{array}{llll} \def\mathdef2017#1{{}}\mathdef2017{source} & \href{../text/lexical.html#text-source}{\mathtt{source}} &::=& \href{../text/lexical.html#text-char}{\mathtt{char}}^\ast \\ \def\mathdef2017#1{{}}\mathdef2017{character} & \href{../text/lexical.html#text-char}{\mathtt{char}} &::=& \def\mathdef2054#1{\mathrm{U{+}#1}}\mathdef2054{00} ~|~ \dots ~|~ \def\mathdef2055#1{\mathrm{U{+}#1}}\mathdef2055{D7FF} ~|~ \def\mathdef2056#1{\mathrm{U{+}#1}}\mathdef2056{E000} ~|~ \dots ~|~ \def\mathdef2057#1{\mathrm{U{+}#1}}\mathdef2057{10FFFF} \\ \end{array}\end{split}\]

Note

While source text may contain any Unicode character in comments or string literals, the rest of the grammar is formed exclusively from the characters supported by the 7-bit ASCII subset of Unicode.

Tokens

The character stream in the source text is divided, from left to right, into a sequence of tokens, as defined by the following grammar.

\[\begin{split}\begin{array}{llll} \def\mathdef2017#1{{}}\mathdef2017{token} & \href{../text/lexical.html#text-token}{\mathtt{token}} &::=& \href{../text/lexical.html#text-keyword}{\mathtt{keyword}} ~|~ \href{../text/values.html#text-int}{\def\mathdef2038#1{{\mathtt{u}#1}}\mathdef2038{N}} ~|~ \href{../text/values.html#text-int}{\def\mathdef2044#1{{\mathtt{s}#1}}\mathdef2044{N}} ~|~ \href{../text/values.html#text-float}{\def\mathdef2050#1{{\mathtt{f}#1}}\mathdef2050{N}} ~|~ \href{../text/values.html#text-string}{\mathtt{string}} ~|~ \href{../text/values.html#text-id}{\mathtt{id}} ~|~ \def\mathdef2058#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2058{(} ~|~ \def\mathdef2059#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2059{)} ~|~ \href{../text/lexical.html#text-reserved}{\mathtt{reserved}} \\ \def\mathdef2017#1{{}}\mathdef2017{keyword} & \href{../text/lexical.html#text-keyword}{\mathtt{keyword}} &::=& (\def\mathdef2060#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2060{a} ~|~ \dots ~|~ \def\mathdef2061#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2061{z})~\href{../text/values.html#text-idchar}{\mathtt{idchar}}^\ast \qquad (\mbox{if occurring as a literal terminal in the grammar}) \\ \def\mathdef2017#1{{}}\mathdef2017{reserved} & \href{../text/lexical.html#text-reserved}{\mathtt{reserved}} &::=& \href{../text/values.html#text-idchar}{\mathtt{idchar}}^+ \\ \end{array}\end{split}\]

Tokens are formed from the input character stream according to the longest match rule. That is, the next token always consists of the longest possible sequence of characters that is recognized by the above lexical grammar. Tokens can be separated by white space, but except for strings, they cannot themselves contain whitespace.

The set of keyword tokens is defined implicitly, by all occurrences of a terminal symbol in literal form, such as \(\def\mathdef2062#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2062{keyword}\), in a syntactic production of this chapter.

Any token that does not fall into any of the other categories is considered reserved, and cannot occur in source text.

Note

The effect of defining the set of reserved tokens is that all tokens must be separated by either parentheses or white space. For example, \(\def\mathdef2063#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2063{0\$x}\) is a single reserved token. Consequently, it is not recognized as two separate tokens \(\def\mathdef2064#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2064{0}\) and \(\def\mathdef2065#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2065{\$x}\), but instead disallowed. This property of tokenization is not affected by the fact that the definition of reserved tokens overlaps with other token classes.

White Space

White space is any sequence of literal space characters, formatting characters, or comments. The allowed formatting characters correspond to a subset of the ASCII format effectors, namely, horizontal tabulation (\(\def\mathdef2066#1{\mathrm{U{+}#1}}\mathdef2066{09}\)), line feed (\(\def\mathdef2067#1{\mathrm{U{+}#1}}\mathdef2067{0A}\)), and carriage return (\(\def\mathdef2068#1{\mathrm{U{+}#1}}\mathdef2068{0D}\)).

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef2017#1{{}}\mathdef2017{white space} & \href{../text/lexical.html#text-space}{\mathtt{space}} &::=& (\def\mathdef2069#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2069{~~} ~|~ \href{../text/lexical.html#text-format}{\mathtt{format}} ~|~ \href{../text/lexical.html#text-comment}{\mathtt{comment}})^\ast \\ \def\mathdef2017#1{{}}\mathdef2017{format} & \href{../text/lexical.html#text-format}{\mathtt{format}} &::=& \def\mathdef2070#1{\mathrm{U{+}#1}}\mathdef2070{09} ~|~ \def\mathdef2071#1{\mathrm{U{+}#1}}\mathdef2071{0A} ~|~ \def\mathdef2072#1{\mathrm{U{+}#1}}\mathdef2072{0D} \\ \end{array}\end{split}\]

The only relevance of white space is to separate tokens. It is otherwise ignored.

Comments

A comment can either be a line comment, started with a double semicolon \(\def\mathdef2037#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2037{{;}{;}}\) and extending to the end of the line, or a block comment, enclosed in delimiters \(\def\mathdef2035#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2035{{(}{;}} \dots \def\mathdef2036#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2036{{;}{)}}\). Block comments can be nested.

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef2017#1{{}}\mathdef2017{comment} & \href{../text/lexical.html#text-comment}{\mathtt{comment}} &::=& \href{../text/lexical.html#text-comment}{\mathtt{linecomment}} ~|~ \href{../text/lexical.html#text-comment}{\mathtt{blockcomment}} \\ \def\mathdef2017#1{{}}\mathdef2017{line comment} & \href{../text/lexical.html#text-comment}{\mathtt{linecomment}} &::=& \def\mathdef2037#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2037{{;}{;}}~~\href{../text/lexical.html#text-comment}{\mathtt{linechar}}^\ast~~(\def\mathdef2073#1{\mathrm{U{+}#1}}\mathdef2073{0A} ~|~ \mathtt{eof}) \\ \def\mathdef2017#1{{}}\mathdef2017{line character} & \href{../text/lexical.html#text-comment}{\mathtt{linechar}} &::=& c{:}\href{../text/lexical.html#text-char}{\mathtt{char}} & (\mathrel{\mbox{if}} c \neq \def\mathdef2074#1{\mathrm{U{+}#1}}\mathdef2074{0A}) \\ \def\mathdef2017#1{{}}\mathdef2017{block comment} & \href{../text/lexical.html#text-comment}{\mathtt{blockcomment}} &::=& \def\mathdef2035#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2035{{(}{;}}~~\href{../text/lexical.html#text-comment}{\mathtt{blockchar}}^\ast~~\def\mathdef2036#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2036{{;}{)}} \\ \def\mathdef2017#1{{}}\mathdef2017{block character} & \href{../text/lexical.html#text-comment}{\mathtt{blockchar}} &::=& c{:}\href{../text/lexical.html#text-char}{\mathtt{char}} & (\mathrel{\mbox{if}} c \neq \def\mathdef2075#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2075{;} \wedge c \neq \def\mathdef2076#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2076{(}) \\ &&|& \def\mathdef2077#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2077{;} & (\mathrel{\mbox{if}}~\mbox{the next character is not}~\def\mathdef2078#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2078{)}) \\ &&|& \def\mathdef2079#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2079{(} & (\mathrel{\mbox{if}}~\mbox{the next character is not}~\def\mathdef2080#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2080{;}) \\ &&|& \href{../text/lexical.html#text-comment}{\mathtt{blockcomment}} \\ \end{array}\end{split}\]

Here, the pseudo token \(\mathtt{eof}\) indicates the end of the input. The look-ahead restrictions on the productions for \(\href{../text/lexical.html#text-comment}{\mathtt{blockchar}}\) disambiguate the grammar such that only well-bracketed uses of block comment delimiters are allowed.

Note

Any formatting and control characters are allowed inside comments.