解析器
白菜 2025/3/13 Vue3编译
# 文本模式
| 模式 | 能否解析标签 | 是否支持 HTML 实体 |
|---|---|---|
| DATA | 能 | 是 |
| RCDATA | 否 | 是 |
| RAWTEXT | 否 | 否 |
| CDATA | 否 | 否 |
- 遇到标签
<tilte><textarea>会进入RCDATA模式 <style><iframe><noFrames>,<noscript>等会进入RAWTEXT模式<!CDATA[字符串会进入CDATA模式
# 递归下降算法构造 ast
由于创建 token 和 构造模板 ast 具有同构性,因此两者可以同时进行。
- 解析标签
- 清除多余标签
- 清除空格
- 解析属性
- 递归解析子节点
- 解析插值表达式
- 文本节点
- 注释文本
- 解析结束标签
- 标签是否正常关闭
在解析子节点 parseChildren 的过程中,会调用解析标签节点 parseElement 的方法,从而间接调用 parseChildren 的方法,从而产生一个新的状态机
上一级 parseChildren 函数的调用用于构造上级模板的 ast, 被递归调用的下级 parseChildren 函数用于构造下级模板的 ast,最终构造一个树形结构的 ast