36.1 语法表基本概念

语法表是一种数据结构,可用于查询每个字符的 语法类别(syntax class) 与其他语法属性。 Lisp 程序在扫描与遍历文本时会使用语法表。

在内部实现中,语法表是一个字符表(see 字符表)。 索引为 c 的元素描述了编码为 c 的字符; 其值为一个 cons 单元,用于指定对应字符的语法规则。 详细说明见 See 语法表内部实现。 不过,通常不应使用 asetaref 修改或查看语法表内容, 而应使用更高级的函数 char-syntaxmodify-syntax-entry, 相关说明见 语法表函数

Function: syntax-table-p object

object 是语法表,该函数返回 t

每个缓冲区都拥有独立的主模式,每种主模式对各类字符的语法类别都有各自的定义。 例如,在 Lisp 模式中,字符 ‘;’ 表示注释开始, 但在 C 模式中,它表示语句结束。 为支持这类差异,语法表是每个缓冲区私有的。 通常,每种主模式都拥有专属的语法表,并将其应用到所有使用该模式的缓冲区。 例如,变量 emacs-lisp-mode-syntax-table 保存了 Emacs Lisp 模式使用的语法表, c-mode-syntax-table 保存了 C 模式使用的语法表。 修改某主模式的语法表,会同时改变该模式下所有现有缓冲区 以及后续切换至该模式的缓冲区的语法规则。 部分相似的模式会共用同一个语法表。 设置语法表的示例见 See 主模式示例

语法表可以从另一个语法表 继承(inherit) 语法规则, 该语法表被称为它的 父语法表(parent syntax table)。 语法表可以将部分字符设为“继承”语法类别,不指定其具体规则; 这类字符会从父语法表中获取对应的语法类别(see 语法类别表)。 Emacs 定义了一个 标准语法表(standard syntax table),它是默认的父语法表, 同时也是基本模式(Fundamental mode)所使用的语法表。

Function: standard-syntax-table

该函数返回标准语法表,即基本模式所使用的语法表。

Emacs Lisp 读取器不使用语法表,它拥有一套内置且不可修改的语法规则。 (部分 Lisp 系统支持重新定义读取语法,但为简洁起见,Emacs Lisp 未提供该功能。)