36.7 语法表内部实现

语法表以字符表(char-table)实现(see 字符表),但大多数 Lisp 程序不会直接操作其元素。 语法表并不以语法描述符存储语法数据(see 语法描述符),而是使用本节说明的内部格式。该内部格式也可作为语法属性赋值(see 语法属性)。

语法表中的每个条目都是一个原始语法描述符(raw syntax descriptor):格式为 (syntax-code . matching-char) 的 cons 单元。 syntax-code 是一个整数,根据下表编码语法分类与语法标记。matching-charnil 时指定匹配字符(与语法描述符中的第二个字符作用类似)。

使用 aref(see 操作数组的函数)获取字符的原始语法描述符,例如 (aref (syntax-table) ch)

以下为各语法分类对应的语法代码:

代码分类代码分类
0空白字符8配对定界符
1标点符号9转义符
2单词构成字符10字符引用符
3符号构成字符11注释开始符
4左括号12注释结束符
5右括号13继承
6表达式前缀符14通用注释符
7字符串引号15通用字符串符

例如,标准语法表中 ‘(’ 对应的条目为 (4 . 41),其中 41 是字符 ‘)’ 的编码。

语法标记编码在高位比特位,从最低位开始第 16 位起。下表给出各语法标记对应的 2 的幂次值。

标记对应值标记对应值
1(ash 1 16)p(ash 1 20)
2(ash 1 17)b(ash 1 21)
3(ash 1 18)n(ash 1 22)
4(ash 1 19)c(ash 1 23)
Function: string-to-syntax desc

传入语法描述符 desc(字符串),该函数返回对应的原始语法描述符。

Function: syntax-class-to-char syntax

传入原始语法描述符中的 syntax(整数),该函数返回对应的语法描述符字符。

Function: syntax-after pos

该函数返回缓冲区位置 pos 之后字符的原始语法描述符,同时考虑语法属性与语法表。若 pos 位于缓冲区可访问区域之外(see accessible portion),返回值为 nil

Function: syntax-class syntax

该函数返回原始语法描述符 syntax 对应的语法代码。更精确地说,它提取原始语法描述符的 syntax-code 部分,屏蔽掉记录语法标记的高 16 位后返回结果整数。

syntaxnil,返回值为 nil。因此表达式

(syntax-class (syntax-after pos))

pos 超出缓冲区可访问区域时会返回 nil,不会抛出错误或返回无效代码。