得鹿梦鱼 得鹿梦鱼

前置需要

语法介绍

markdown 的语法请参考markdown 中文网

  1. 允许您通过将行缩进四个空格或一个制表符来创建代码块
  2. 要创建水平线***,请单独在一行上使用三个或更多的星号(),破折号(---)或下划线(___)

CST 树

具象语法树(Concret Syntax Tree) 简称 CST 树,是包含代码所有语法信息的树型结构,它是代码的直接翻译,有时也被成为解析树

AST 树

抽象语法树 Abstract Syntax Tree简称 AST 树, 是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构
忽略了一些具象语法树包含的一些语法信息,剥离掉一些不重要的细节

如何生成

  1. 词法分析:从左到右扫描文本,把文本拆成一些单词。然后,这些单词传入分词器,经过一系列的识别器,确定这些单词的词性,这一过程的产物是token 序列
  2. 语法分析:token 序列会经过我们的解析器,由解析器识别出代码中的各类短语,会根据语言的文法规则输出解析树,同时,验证语法,语法如果有错的话,抛出语法错误
  3. 构建抽象语法树:在语法分析的过程中,递归下降分析器的每个函数都会返回一个 AST 子树。通过在这些函数中构造和连接这些子树,最终形成整个源代码的 AST
  4. 语义分析:也就是生成可执行的代码

marked 配置

选项类型描述
pedanticboolean是否将 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