36.6.3 解析状态

解析状态(parser state)是一个(当前为)包含十一个元素的列表,用于描述语法解析器通过 parse-partial-sexp(see 底层解析)解析缓冲区中指定起点到终点文本后的解析器状态。 syntax-ppss 等解析函数 (see 获取位置的解析状态) 同样会返回解析状态作为结果。parse-partial-sexp 可接收解析状态作为参数,以继续解析。

  1. 括号嵌套深度,从 0 开始计数。注意:若解析起点与终点间右括号数量多于左括号,该值可能为负数。
  2. 包含停止位置的最内层括号结构的起始字符位置;无则为 nil
  3. 已结束的最后一个完整子表达式的起始字符位置;无则为 nil
  4. 处于字符串内部时为非 nil。更精确地说,该值为结束该字符串的字符;若应由通用字符串定界符结束则为 t
  5. 处于不可嵌套注释内时为 t(任意注释风格;see 语法标记);处于可嵌套注释内时为注释嵌套层级。
  6. 终点位置紧跟在引用字符之后时为 t
  7. 本次扫描过程中遇到的最小括号深度。
  8. 当前活跃注释的类型:不在注释内或为 ‘a’ 型注释时为 nil;‘b’ 型注释为 1;‘c’ 型注释为 2;应由通用注释定界符结束的注释为 syntax-table
  9. 字符串或注释的起始位置。处于注释内时为注释开始位置;处于字符串内时为字符串开始位置;在字符串与注释之外时为 nil
  10. 当前未闭合括号的位置列表,从最外层开始。
  11. 若最后扫描的缓冲区位置是双字符结构(注释定界符或转义/字符引用字符对)的(可能的)首个字符,则为该位置的 syntax-code(see 语法表内部实现);否则为 nil

传入 parse-partial-sexp 用于继续解析的状态中,元素 1、2、6 会被忽略。元素 9 和 10 主要供解析器代码内部使用。

以下函数可从解析状态中提取更多有用信息:

Function: syntax-ppss-toplevel-pos state

该函数从解析状态 state 中提取本次解析扫描到的、处于语法结构顶层的最后位置。“顶层(At top level)”指不在任何括号、注释或字符串内部。

state 对应的解析已到达顶层位置,则返回值为 nil

Function: syntax-ppss-context state

若状态 state 对应的扫描终点位于字符串内则返回 string,位于注释内则返回 comment,否则返回 nil