语法
在定义文本格式的语法规则时,采用以下约定。它们反映了用于 抽象语法 和 二进制格式 的约定。为了区分文本语法的符号和抽象语法的符号,对前者采用\(\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}}}\) 非终结符的属性,在本例中,这些属性是解析成的实际 无符号整数。完整产生式的属性然后是限制的抽象语法,以以前的数值表示。
上下文
文本格式允许使用符号 标识符 代替 索引。为了将这些标识符解析为具体的索引,某些语法产生式由标识符上下文 \(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\)) 条目关联。
如果没有任何索引空间包含重复的标识符,则标识符上下文是格式良好的。
约定
为了避免不必要的混乱,在写出标识符上下文时,会省略空组件。例如,记录 \(\{\}\) 是 标识符上下文 的简写,其组件都是空的。