约定

WebAssembly 模块 的文本格式是其 抽象语法 渲染成 S 表达式

二进制格式 一样,文本格式由一个属性文法定义。文本字符串是模块的格式良好的描述,当且仅当它是由文法生成的。此文法的每个产生式最多只有一个综合属性:相应字符序列表示的抽象语法。因此,属性文法隐式地定义了一个解析函数。某些产生式还会将上下文作为继承属性,该属性记录绑定 标识符

除了少数例外,文本文法的核心与抽象语法的文法非常相似。但是,它还定义了许多缩写,这些缩写是核心语法的“语法糖”。

包含以文本格式表示的 WebAssembly 模块的文件的推荐扩展名是“\(\mathtt{.wat}\)”。根据 Unicode(第 2.5 节),具有此扩展名的文件假定以 UTF-8 编码。

语法

在定义文本格式的语法规则时,采用以下约定。它们反映了用于 抽象语法二进制格式 的约定。为了区分文本语法的符号和抽象语法的符号,对前者采用\(\mathtt{等宽字体}\)

  • 终结符要么是用引号括起来的字符的字面字符串,要么表示为 Unicode 标量值:\(\def\mathdef2722#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2722{module}\)\(\def\mathdef2723#1{\mathrm{U{+}#1}}\mathdef2723{0A}\)。(所有按字面意义编写的字符都明确地取自 Unicode 的 7 位 ASCII 子集。)

  • 非终结符以等宽字体书写:\(\mathtt{valtype}, \mathtt{instr}\)

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

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

  • \(T^+\) 是一个或多个 \(T\) 的迭代序列。(这是在 \(n \geq 1\) 的情况下使用的 \(T^n\) 的简写。)

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

  • \(x{:}T\) 表示与非终结符 \(T\) 相同的语言,但也将变量 \(x\) 绑定到为 \(T\) 合成的属性。也可以使用模式而不是变量,例如 \((x,y){:}T\)

  • 产生式写成 \(\mathtt{sym} ::= T_1 \Rightarrow A_1 ~|~ \dots ~|~ T_n \Rightarrow A_n\),其中每个 \(A_i\) 是为 \(\mathtt{sym}\) 在给定情况下合成的属性,通常来自 \(T_i\) 中绑定的属性变量。

  • 某些产生式由括号中的附加条件增强,这些条件限制了产生式的适用性。它们为将产生式组合扩展为许多单独的情况提供了一种简写。

  • 如果同一个元变量或非终结符在产生式中多次出现(在语法或属性中),则所有这些出现必须具有相同的实例化。

  • 区分词法语法产生式。对于后者,在文法包含空格的任何位置都允许任意 空白字符。定义 词法语法 语法的产生式被认为是词法的,所有其他产生式都是语法的。

注意

例如,文本文法 用于 数字类型 定义如下

\[\begin{split}\begin{array}{llcll@{\qquad\qquad}l} \def\mathdef2683#1{{}}\mathdef2683{数字类型} & \href{../text/types.html#text-numtype}{\mathtt{numtype}} &::=& \def\mathdef2724#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2724{i32} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{i32}} \\ &&|& \def\mathdef2725#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2725{i64} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{i64}} \\ &&|& \def\mathdef2726#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2726{f32} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{f32}} \\ &&|& \def\mathdef2727#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef2727{f64} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{f64}} \\ \end{array}\end{split}\]

用于 限制文本文法 定义如下

\[\begin{split}\begin{array}{llclll} \def\mathdef2683#1{{}}\mathdef2683{限制} & \href{../text/types.html#text-limits}{\mathtt{limits}} &::=& n{:}\href{../text/values.html#text-int}{\def\mathdef2708#1{{\mathtt{u}#1}}\mathdef2708{\mathtt{32}}} &\Rightarrow& \{ \href{../syntax/types.html#syntax-limits}{\mathsf{min}}~n, \href{../syntax/types.html#syntax-limits}{\mathsf{max}}~\epsilon \} \\ &&|& n{:}\href{../text/values.html#text-int}{\def\mathdef2708#1{{\mathtt{u}#1}}\mathdef2708{\mathtt{32}}}~~m{:}\href{../text/values.html#text-int}{\def\mathdef2708#1{{\mathtt{u}#1}}\mathdef2708{\mathtt{32}}} &\Rightarrow& \{ \href{../syntax/types.html#syntax-limits}{\mathsf{min}}~n, \href{../syntax/types.html#syntax-limits}{\mathsf{max}}~m \} \\ \end{array}\end{split}\]

变量 \(n\)\(m\) 命名相应 \(\href{../text/values.html#text-int}{\def\mathdef2708#1{{\mathtt{u}#1}}\mathdef2708{\mathtt{32}}}\) 非终结符的属性,在本例中,这些属性是解析成的实际 无符号整数。完整产生式的属性然后是限制的抽象语法,以以前的数值表示。

缩写

除了与 抽象语法 直接对应的核心文法之外,文本语法还定义了一些缩写,可用于方便和可读性。

缩写由重写规则定义,这些规则指定其扩展到核心语法

\[\mathit{缩写语法} \quad\equiv\quad \mathit{扩展语法}\]

假定在应用核心语法规则构建抽象语法之前,递归地并按出现顺序应用这些扩展。

上下文

文本格式允许使用符号 标识符 代替 索引。为了将这些标识符解析为具体的索引,某些语法产生式由标识符上下文 \(I\) 索引,作为综合属性,记录每个 索引空间 中声明的标识符。此外,上下文记录模块中定义的类型,以便可以为 函数 计算 参数 索引。

将标识符上下文定义为 记录 \(I\) 作为抽象语法很方便,如下所示

\[\begin{split}\begin{array}{llll} \def\mathdef2683#1{{}}\mathdef2683{标识符上下文} & I &::=& \begin{array}[t]{l@{~}ll} \{ & \href{../text/conventions.html#text-context}{\mathsf{types}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{funcs}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{tables}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{mems}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{globals}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{elem}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{data}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{locals}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{labels}} & (\href{../text/values.html#text-id}{\mathtt{id}}^?)^\ast, \\ & \href{../text/conventions.html#text-context}{\mathsf{typedefs}} & \href{../syntax/types.html#syntax-functype}{\mathit{functype}}^\ast ~\} \\ \end{array} \end{array}\end{split}\]

对于每个索引空间,此类上下文包含分配给定义索引的 标识符 列表。未命名的索引与这些列表中的空 (\(\epsilon\)) 条目关联。

如果没有任何索引空间包含重复的标识符,则标识符上下文是格式良好的

约定

为了避免不必要的混乱,在写出标识符上下文时,会省略空组件。例如,记录 \(\{\}\)标识符上下文 的简写,其组件都是空的。

向量

向量 写成普通序列,但对这些序列的长度有限制。

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef2683#1{{}}\mathdef2683{向量} & \href{../text/conventions.html#text-vec}{\mathtt{vec}}(\mathtt{A}) &::=& (x{:}\mathtt{A})^n &\Rightarrow& x^n & (\mathrel{\mbox{if}} n < 2^{32}) \\ \end{array}\end{split}\]