约定

WebAssembly 是一种编程语言,具有多种具体表示形式(其二进制格式文本格式)。两者都映射到一个公共结构。为了简洁起见,此结构以抽象语法的形式描述。本规范的所有部分都根据此抽象语法定义。

语法表示法

在定义抽象语法的语法规则时,采用以下约定。

  • 终结符(原子)以无衬线字体或符号形式书写:\(\mathsf{i32}, \mathsf{end}, {\href{../syntax/types.html#syntax-functype}{\rightarrow}}, [, ]\)

  • 非终结符以斜体形式书写:\(\mathit{valtype}, \mathit{instr}\)

  • \(A^n\)\(A\)\(n\geq 0\) 次迭代的序列。

  • \(A^\ast\)\(A\) 的可能为空的迭代序列。(这是在 \(n\) 不相关的情况下使用的 \(A^n\) 的简写形式。)

  • \(A^+\)\(A\) 的非空迭代序列。(这是在 \(n \geq 1\) 的情况下使用的 \(A^n\) 的简写形式。)

  • \(A^?\)\(A\) 的可选出现。(这是在 \(n \leq 1\) 的情况下使用的 \(A^n\) 的简写形式。)

  • 产生式写成 \(\mathit{sym} ::= A_1 ~|~ \dots ~|~ A_n\)

  • 大型产生式可以拆分为多个定义,用显式省略号表示第一个产生式的结束,\(\mathit{sym} ::= A_1 ~|~ \dots\),并用省略号开始后续定义,\(\mathit{sym} ::= \dots ~|~ A_2\)

  • 一些产生式用括号中的附加条件“\((\mathrel{\mbox{if}} \mathit{condition})\)”进行增强,该条件为将产生式组合扩展为许多单独情况提供了一种简写形式。

  • 如果同一个元变量或非终结符在产生式中出现多次,则所有这些出现必须具有相同的实例。(这是要求多个不同变量相等的附加条件的简写形式。)

辅助表示法

在处理语法结构时,还使用以下表示法

  • \(\epsilon\) 表示空序列。

  • \(|s|\) 表示序列 \(s\) 的长度。

  • \(s[i]\) 表示序列 \(s\) 的第 \(i\) 个元素,从 \(0\) 开始。

  • \(s[i \href{../syntax/conventions.html#notation-slice}{\mathrel{\mathbf{:}}} n]\) 表示序列 \(s\) 的子序列 \(s[i]~\dots~s[i+n-1]\)

  • \(s \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} [i] = A\) 表示与 \(s\) 相同的序列,只是将第 \(i\) 个元素替换为 \(A\)

  • \(s \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} [i \href{../syntax/conventions.html#notation-slice}{\mathrel{\mathbf{:}}} n] = A^n\) 表示与 \(s\) 相同的序列,只是将子序列 \(s[i \href{../syntax/conventions.html#notation-slice}{\mathrel{\mathbf{:}}} n]\) 替换为 \(A^n\)

  • \(\href{../syntax/conventions.html#notation-concat}{\mathrm{concat}}(s^\ast)\) 表示通过连接 \(s^\ast\) 中的所有序列 \(s_i\) 形成的扁平序列。

此外,还采用了以下约定

  • 表示法 \(x^n\)(其中 \(x\) 是一个非终结符)被视为一个元变量,范围是 \(x\) 的相应序列(对于 \(x^\ast\)\(x^+\)\(x^?\) 也是如此)。

  • 给定一个序列 \(x^n\),则序列 \((A_1~x~A_2)^n\)\(x\) 的出现假定与 \(x^n\) 存在逐点对应关系(对于 \(x^\ast\)\(x^+\)\(x^?\) 也是如此)。这隐式地表达了一种在序列上映射语法结构的形式。

以下形式的产生式被解释为记录,将一组固定的字段 \(\mathsf{field}_i\) 分别映射到“值” \(A_i\)

\[\mathit{r} ~::=~ \{ \mathsf{field}_1~A_1, \mathsf{field}_2~A_2, \dots \}\]

采用以下表示法来操作此类记录

  • \(r.\mathsf{field}\) 表示 \(r\)\(\mathsf{field}\) 组件的内容。

  • \(r \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} \mathsf{field} = A\) 表示与 \(r\) 相同的记录,只是将 \(\mathsf{field}\) 组件的内容替换为 \(A\)

  • \(r_1 \href{../syntax/conventions.html#notation-compose}{\oplus} r_2\) 表示两个具有相同字段序列的记录的组合,通过逐点追加每个序列

    \[\{ \mathsf{field}_1\,A_1^\ast, \mathsf{field}_2\,A_2^\ast, \dots \} \href{../syntax/conventions.html#notation-compose}{\oplus} \{ \mathsf{field}_1\,B_1^\ast, \mathsf{field}_2\,B_2^\ast, \dots \} = \{ \mathsf{field}_1\,A_1^\ast~B_1^\ast, \mathsf{field}_2\,A_2^\ast~B_2^\ast, \dots \}\]
  • \(\href{../syntax/conventions.html#notation-compose}{\bigoplus} r^\ast\) 表示一系列记录的组合;如果序列为空,则结果记录的所有字段都为空。

序列和记录的更新表示法递归地推广到由“路径” \(\mathit{pth} ::= ([\dots] \;| \;.\mathsf{field})^+\) 访问的嵌套组件

  • \(s \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} [i]\,\mathit{pth} = A\)\(s \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} [i] = (s[i] \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} \mathit{pth} = A)\) 的简写形式,

  • \(r \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} \mathsf{field}\,\mathit{pth} = A\)\(r \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} \mathsf{field} = (r.\mathsf{field} \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} \mathit{pth} = A)\) 的简写形式,

其中 \(r \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}}~.\mathsf{field} = A\) 简写为 \(r \href{../syntax/conventions.html#notation-replace}{\mathrel{\mbox{with}}} \mathsf{field} = A\)

向量

向量是形式为 \(A^n\)(或 \(A^\ast\))的有界序列,其中 \(A\) 可以是值或复杂构造。向量最多可以有 \(2^{32}-1\) 个元素。

\[\begin{split}\begin{array}{lllll} \def\mathdef2441#1{{}}\mathdef2441{vector} & \href{../syntax/conventions.html#syntax-vec}{\mathit{vec}}(A) &::=& A^n & (\mathrel{\mbox{if}} n < 2^{32})\\ \end{array}\end{split}\]