缩进

Nim 的标准语法描述了 indentation sensitive “缩进敏感”的语言特性,表示其所有的控制结构可以通过缩进来识别,缩进只包括空格,不允许使用制表符。

处理缩进的实现方式如下,词法分析器用前导空格数来解释随后的 Token,缩进不是独立的 Token,这个技巧使得 Nim 解析时只需要预先检查 1 个 Token。

语法分析器使用一个缩进级别的堆栈:该堆栈由计算空格的整数组成,语法分析器在对应的策略位置查询缩进信息,而忽略其他位置。 伪终结符 IND{>} 表示缩进相比堆栈顶部的条目包含更多的空格, IND{=} 表示缩进有相同的空格数,DED 是另一个伪终结符, 表示从堆栈中弹出一个值的 action 动作, IND{>} 则意味着推到堆栈中。

用这些标记,我们现在可以容易地定义出核心语法:语句块。以下是简化的例子:

ifStmt = ‘if’ expr ‘:’ stmt (IND{=} ‘elif’ expr ‘:’ stmt)* (IND{=} ‘else’ ‘:’ stmt)?

simpleStmt = ifStmt / …

stmt = IND{>} stmt ^+ IND{=} DED # 语句列表 / simpleStmt # 或者单个语句