前置需要
语法介绍
markdown 的语法请参考markdown 中文网
- 允许您通过将行缩进四个空格或一个制表符来创建代码块
- 要创建水平线***,请单独在一行上使用三个或更多的星号(),破折号(---)或下划线(___)
CST 树
具象语法树(Concret Syntax Tree) 简称 CST 树,是包含代码所有语法信息的树型结构,它是代码的直接翻译,有时也被成为解析树
AST 树
抽象语法树 Abstract Syntax Tree简称 AST 树, 是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构
忽略了一些具象语法树包含的一些语法信息,剥离掉一些不重要的细节
如何生成
- 词法分析:从左到右扫描文本,把文本拆成一些单词。然后,这些单词传入分词器,经过一系列的识别器,确定这些单词的词性,这一过程的产物是token 序列
- 语法分析:token 序列会经过我们的解析器,由解析器识别出代码中的各类短语,会根据语言的文法规则输出解析树,同时,验证语法,语法如果有错的话,抛出语法错误
- 构建抽象语法树:在语法分析的过程中,递归下降分析器的每个函数都会返回一个 AST 子树。通过在这些函数中构造和连接这些子树,最终形成整个源代码的 AST
- 语义分析:也就是生成可执行的代码
marked 配置
| 选项 | 类型 | 描述 |
|---|---|---|
| pedantic | boolean | 是否将 tab 制表符更换为 4 个空格以及删除多个空行 |
特殊正则注解
空格或者制表符创建代码块
markdown 基本语法允许您通过将行缩进四个空格或一个制表符来创建代码块
/^?: {4} {0,3}\t[^\n]+?:\n?:[ \t]*?:\n$*?+//^?: {4} {0,3}\t/匹配空格缩进或者制表符/[^\n]+/匹配代码块的内容/?:\n$/匹配结束或者换行/?:[ \t]*?:\n$*/匹配结束或者换行可以存在任意个空格或者制表符/?:\n?:[ \t]*?:\n$*/代码块结束匹配支持换行但是只能是空白或者制表符
围栏代码块
/^ {0,3}`{3,}?=[^`\n]*?:\n$~{3,}[^\n]*?:\n$?:[\s\S]*??:\n$?: {0,3}\1[~`]* *?=\n$$//^ {0,3}/ 围栏代码块可以有空白缩进/`{3,}?=[^`\n]*?:\n$~{3,}/ 匹配围栏代码块的代码开始行/`{3,}?=[^`\n]*?:\n$~{3,}/ 匹配围栏代码块的代码开始行[^\n]*?:\n$?:[\s\S]*??:\n$ 匹配代码正文?: {0,3}\1[~`]* *?=\n$$/匹配围栏代码块的代码结束行
个人感觉
marked的正则对空白的匹配是宽松的
日志
- 2025-1-3 解析正则 blockCode
- 2025-1-7 解析正则 blockquote