Lezer 概述
Lezer 是 CodeMirror 6 版本所使用的语法解析器,用于对代码文本进行分词 tokenizer 并构建语法树 syntax tree
说明
Lezer 所生成的 syntax tree 具有语法相关的信息,但是和常见的 AST(abstract syntax tree 抽象语法树)不同,它所生成的是 non-abstract syntax tree,即在语法树中会保留空格、缩进等字符级别的详细信息,以便在对文本高亮时进行精确的定位
核心模块
Lezer 有三个核心模块:
- @lezer/common 模块:描述 Lezer 语法树所采用的数据结构,以及一些操作 syntax tree 的方法
- @lezer/generator 模块:该模块提供命令行工具和 JS 方法,可以通过两种方式根据用户编写的(针对特定编程语言的)语法描述文件
.grammar生成解析表 parse table(JS 文件) - @lezer/lr 模块:该模块提供一个 GLR(generalized left-to-right rightmost derivation parser 通用的自左向右推导最右内容的解析器),该 parser 支持增量式解析,根据 @lezer/generator 模块所生成的解析表,对特定的文本进行分词并构建语法树
其他模块
另外官方还提供了一个 @lezer/highlight 模块,提供了一些辅助函数,以便往语法树上附加高亮相关的信息
语法描述文件
将对特定编程语言的语法规则描述编写在后缀为 .grammar 的文件里,然后通过(由 @lezer/generator 模块提供的命令行工具)命令 lezer-generator xxx.grammar -o xxx.js 根据描述文件生成 parse table 解析表
Lezer 官方提供了一系列常见编程语言的 grammar 文件可以直接使用,或参考这些示例为所需语言编写相应的 .grammar 语法描述性文件
提示
CodeMirror 6 也可以使用 CodeMirror 5 版本的语法解析器,以复用旧的资源,但是只能实现分词等简单的功能