Emacs 提供多种方式解析程序源代码文本并生成 语法树(syntax tree)。在语法树中,文本不再被视为一维的字符流, 而是由节点构成的结构化树,每个节点代表一段文本。 因此,语法树可以实现诸多实用功能,例如精确的字体渲染、缩进、 导航、结构化编辑等。
Emacs 内置了用于解析平衡表达式的简易工具 (see 表达式解析)。同时还提供用于通用导航与缩进的 SMIE 库 (see 简易缩进引擎(SMIE))。
除此之外,如果编译时启用了相关支持,Emacs 还可以集成 tree-sitter 库。 tree-sitter 库实现了增量解析器,并支持大量编程语言。
如果当前 Emacs 会话可用 tree-sitter 功能,该函数返回非 nil。
要使用 tree-sitter 库解析程序源代码并获取程序的语法树, Lisp 程序需要加载对应语言的语法库,并为该语言与当前缓冲区创建解析器。 之后,Lisp 程序便可向解析器查询语法树中的特定节点, 获取各类节点信息,并使用强大的模式匹配语法搜索节点。 本章将说明上述所有操作的实现方法,以及 Lisp 程序如何处理 混合多种编程语言的源文件。