缩进
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 # 或者单个语句
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .