缩进

Nim的标准语法描述了一个 缩进敏感 语言。 这意味着所有控制结构都可以通过缩进识别。 缩进仅由空格组成;制表符是不允许的。

缩进处理按如下方式实现:词法分析器使用前面的空格数注释以下标记;缩进不是一个单独的标记。 这个技巧允许只用1个先行标记解析Nim。

解析器使用由整数个空格组成的缩进堆栈级别。 缩进信息在解析器重要的位置上查询,否则被忽略:伪终端 IND{>} 表示由比在堆栈顶部更多的空格构成; IND{=} 缩进具有相同数量的空格。 DED 是描述从堆栈弹出一个值的运作的伪代码, IND{>} 意味着推到栈上。

使用这种表示法,我们现在可以轻松定义语法的核心:一个语句块(简化示例):

  1. ifStmt = 'if' expr ':' stmt
  2. (IND{=} 'elif' expr ':' stmt)*
  3. (IND{=} 'else' ':' stmt)?
  4.  
  5. simpleStmt = ifStmt / ...
  6.  
  7. stmt = IND{>} stmt ^+ IND{=} DED # list of statements
  8. / simpleStmt # or a simple statement