语法表是一种数据结构,可用于查询每个字符的 语法类别(syntax class) 与其他语法属性。 Lisp 程序在扫描与遍历文本时会使用语法表。
在内部实现中,语法表是一个字符表(see 字符表)。
索引为 c 的元素描述了编码为 c 的字符;
其值为一个 cons 单元,用于指定对应字符的语法规则。
详细说明见 See 语法表内部实现。
不过,通常不应使用 aset 与 aref 修改或查看语法表内容,
而应使用更高级的函数 char-syntax 与 modify-syntax-entry,
相关说明见 语法表函数。
若 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)所使用的语法表。
该函数返回标准语法表,即基本模式所使用的语法表。
Emacs Lisp 读取器不使用语法表,它拥有一套内置且不可修改的语法规则。 (部分 Lisp 系统支持重新定义读取语法,但为简洁起见,Emacs Lisp 未提供该功能。)