约定¶
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\)
采用以下表示法来操作此类记录
\(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\) 个元素。