You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:45:30