如何从Chevrotain的CstElement/CstNode对象重建原始文本?
从Chevrotain的CstElement/CstNode重建原始文本
Chevrotain的CST(具体语法树)确实能实现原始文本的精确重建——它完整保留了所有语法单元,包括AST会丢弃的空格、换行、注释这类细节。核心思路是遍历CST节点关联的所有Token实例,拼接它们的image属性值,具体实现如下:
核心原理
每个Chevrotain Token实例的image属性,就是该Token匹配到的原始文本内容。CstNode/CstElement通过children(子节点集合)和tokens(直接关联的Token列表)属性层层嵌套,递归遍历这些结构就能拼接出完整的原始输入。
实现示例
下面是一个通用的递归处理函数,适配大多数CST结构:
function reconstructOriginalText(cstNode) { let result = ""; // 先处理当前节点直接包含的Token if (cstNode.tokens) { cstNode.tokens.forEach(token => { result += token.image; }); } // 递归处理所有子节点分组 if (cstNode.children) { Object.values(cstNode.children).forEach(childGroup => { // 统一处理单节点或数组形式的子节点 const children = Array.isArray(childGroup) ? childGroup : [childGroup]; children.forEach(child => { if (child.image) { // 是Token,直接追加原始文本 result += child.image; } else if (child.tokens || child.children) { // 是CST节点,继续递归遍历 result += reconstructOriginalText(child); } }); }); } return result; }
注意事项
- 不同语法规则生成的CST结构可能存在差异(比如自定义节点分组),你可能需要根据自身语法定义微调遍历逻辑。
- 该函数会完整保留所有原始细节,包括空格、注释、换行符,完全还原输入文本。
内容的提问来源于stack exchange,提问作者Jo Liss
相关产品推荐
相关产品推荐

