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\mathdef3503#1{{}}\mathdef3503{source} & \href{../text/lexical.html#text-source}{\mathtt{source}} &::=&
\href{../text/lexical.html#text-char}{\mathtt{char}}^\ast \\
\def\mathdef3503#1{{}}\mathdef3503{character} & \href{../text/lexical.html#text-char}{\mathtt{char}} &::=&
\def\mathdef3547#1{\mathrm{U{+}#1}}\mathdef3547{00} ~|~ \dots ~|~ \def\mathdef3548#1{\mathrm{U{+}#1}}\mathdef3548{D7FF} ~|~ \def\mathdef3549#1{\mathrm{U{+}#1}}\mathdef3549{E000} ~|~ \dots ~|~ \def\mathdef3550#1{\mathrm{U{+}#1}}\mathdef3550{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\mathdef3503#1{{}}\mathdef3503{token} & \href{../text/lexical.html#text-token}{\mathtt{token}} &::=&
\href{../text/lexical.html#text-keyword}{\mathtt{keyword}} ~|~ \href{../text/values.html#text-int}{\def\mathdef3529#1{{\mathtt{u}#1}}\mathdef3529{N}} ~|~ \href{../text/values.html#text-int}{\def\mathdef3535#1{{\mathtt{s}#1}}\mathdef3535{N}} ~|~ \href{../text/values.html#text-float}{\def\mathdef3543#1{{\mathtt{f}#1}}\mathdef3543{N}} ~|~ \href{../text/values.html#text-string}{\mathtt{string}} ~|~ \href{../text/values.html#text-id}{\mathtt{id}} ~|~
\def\mathdef3551#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3551{(} ~|~ \def\mathdef3552#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3552{)} ~|~ \href{../text/lexical.html#text-reserved}{\mathtt{reserved}} \\
\def\mathdef3503#1{{}}\mathdef3503{keyword} & \href{../text/lexical.html#text-keyword}{\mathtt{keyword}} &::=&
(\def\mathdef3553#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3553{a} ~|~ \dots ~|~ \def\mathdef3554#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3554{z})~\href{../text/values.html#text-idchar}{\mathtt{idchar}}^\ast
\qquad (\mathrel{\mbox{if}}~\mbox{occurring as a literal terminal in the grammar}) \\
\def\mathdef3503#1{{}}\mathdef3503{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}} ~|~ \def\mathdef3555#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3555{,} ~|~ \def\mathdef3556#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3556{;} ~|~ \def\mathdef3557#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3557{[} ~|~ \def\mathdef3558#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3558{]} ~|~ \def\mathdef3559#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3559{\{} ~|~ \def\mathdef3560#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3560{\}})^+ \\
\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.
Keyword tokens are defined either implicitly by an occurrence of a terminal symbol in literal form, such as \(\def\mathdef3561#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3561{keyword}\), in a syntactic production of this chapter, or explicitly where they arise in 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, white space, or comments.
For example, \(\def\mathdef3562#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3562{0\$x}\) is a single reserved token, as is \(\def\mathdef3563#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3563{"a""b"}\).
Consequently, they are not recognized as two separate tokens \(\def\mathdef3564#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3564{0}\) and \(\def\mathdef3565#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3565{\$x}\), or \("a"\) and \("b"\), respectively, 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, comments, or annotations.
The allowed formatting characters correspond to a subset of the ASCII format effectors, namely, horizontal tabulation (\(\def\mathdef3566#1{\mathrm{U{+}#1}}\mathdef3566{09}\)), line feed (\(\def\mathdef3567#1{\mathrm{U{+}#1}}\mathdef3567{0A}\)), and carriage return (\(\def\mathdef3568#1{\mathrm{U{+}#1}}\mathdef3568{0D}\)).
\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l}
\def\mathdef3503#1{{}}\mathdef3503{white space} & \href{../text/lexical.html#text-space}{\mathtt{space}} &::=&
(\def\mathdef3569#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3569{~~} ~|~ \href{../text/lexical.html#text-format}{\mathtt{format}} ~|~ \href{../text/lexical.html#text-comment}{\mathtt{comment}})^\ast \\
\def\mathdef3503#1{{}}\mathdef3503{format} & \href{../text/lexical.html#text-format}{\mathtt{format}} &::=&
\href{../text/lexical.html#text-newline}{\mathtt{newline}} ~|~ \def\mathdef3570#1{\mathrm{U{+}#1}}\mathdef3570{09} \\
\def\mathdef3503#1{{}}\mathdef3503{newline} & \href{../text/lexical.html#text-newline}{\mathtt{newline}} &::=&
\def\mathdef3571#1{\mathrm{U{+}#1}}\mathdef3571{0A} ~|~ \def\mathdef3572#1{\mathrm{U{+}#1}}\mathdef3572{0D} ~|~ \def\mathdef3573#1{\mathrm{U{+}#1}}\mathdef3573{0D}~\def\mathdef3574#1{\mathrm{U{+}#1}}\mathdef3574{0A} \\
\end{array}\end{split}\]
The only relevance of white space is to separate tokens. It is otherwise ignored.
Annotations
An annotation is a bracketed token sequence headed by an annotation id of the form \(\def\mathdef3583#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3583{@id}\) or \(\def\mathdef3584#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3584{@"..."}\).
No space is allowed between the opening parenthesis and this id.
Annotations are intended to be used for third-party extensions;
they can appear anywhere in a program but are ignored by the WebAssembly semantics itself, which treats them as white space.
Annotations can contain other parenthesized token sequences (including nested annotations), as long as they are well-nested.
String literals and comments occurring in an annotation must also be properly nested and closed.
\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l}
\def\mathdef3503#1{{}}\mathdef3503{annotation} & \href{../text/lexical.html#text-annot}{\mathtt{annot}} &::=&
\def\mathdef3585#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3585{(@}~\href{../text/lexical.html#text-annot}{\mathtt{annotid}} ~(\href{../text/lexical.html#text-space}{\mathtt{space}} ~|~ \href{../text/lexical.html#text-token}{\mathtt{token}})^\ast~\def\mathdef3586#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3586{)} \\
\def\mathdef3503#1{{}}\mathdef3503{annotation identifier} & \href{../text/lexical.html#text-annot}{\mathtt{annotid}} &::=&
\href{../text/values.html#text-idchar}{\mathtt{idchar}}^+ ~|~ \href{../text/values.html#text-name}{\mathtt{name}} \\
\end{array}\end{split}\]
Note
The annotation id is meant to be an identifier categorising the extension, and plays a role similar to the name of a custom section.
By convention, annotations corresponding to a custom section should use the custom section’s name as an id.
Implementations are expected to ignore annotations with ids that they do not recognize.
On the other hand, they may impose restrictions on annotations that they do recognize, e.g., requiring a specific structure by superimposing a more concrete grammar.
It is up to an implementation how it deals with errors in such annotations.
Comments¶
A comment can either be a line comment, started with a double semicolon \(\def\mathdef3528#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3528{{;}{;}}\) and extending to the end of the line, or a block comment, enclosed in delimiters \(\def\mathdef3526#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3526{{(}{;}} \dots \def\mathdef3527#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef3527{{;}{)}}\). Block comments can be nested.
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.