如何在AST中为父节点添加内联子节点?Markdown解析器开发疑问
Markdown解析器AST节点归属解决方案
核心实现方法
你的分词器当前输出的是扁平token列表,要实现子节点归属父节点,关键在解析阶段处理层级关联:
- 识别到
##这类块级元素标记时,创建对应父节点(比如Header),并切换解析上下文为该块级元素的内容范围。 - 后续的text、bold等内联token,只要未超出当前块级元素的边界(比如标题行的换行),就直接追加到该父节点的
children数组中。 - 当检测到块级元素结束(如换行后进入新的块级语法),切换回默认上下文,完成当前父节点的子节点收集。
非内联分词的替代方案
- 块级+内联分步分词:先做块级分词,识别出header、paragraph、list等块级token;再针对每个块级token的内容单独执行内联分词,生成bold、italic等内联token。内联token直接作为对应块级token的子节点,天然解决归属问题。
- 状态机栈式解析:解析时维护一个「当前父节点栈」,遇到块级元素时将其压入栈顶作为当前父节点,所有后续内联元素直接挂载到栈顶节点;遇到块级元素结束标记时弹出栈顶,回到上一级父节点。这种方式无需拆分分词步骤,靠状态栈管理层级。
当前思路的问题
你现在的分词器输出全扁平的独立节点,没有区分块级和内联元素的层级属性,会导致解析阶段需要额外做大量的节点匹配逻辑,复杂度陡增。面对嵌套场景(比如列表项里的加粗文本、引用内的链接),扁平token列表根本无法直接对应到正确的父节点,很容易出现节点归属错误。
正确的做法是要么在分词阶段就区分块级/内联token类型,要么在解析阶段补充上下文状态管理,否则单纯依赖扁平token构建AST,在复杂Markdown语法下会彻底失控。
内容的提问来源于stack exchange,提问作者Mohammed Ali Osman
相关产品推荐
相关产品推荐

