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

JavaScript:如何从分词器的tokens数组提取text并格式化输出

实现方案

要完成从tokens数组提取text并整理成目标代码的功能,核心是按语句逻辑对tokens分组,再拼接每组的text内容。以下是具体实现步骤(以JavaScript为例):

1. 分析语句结构

从示例能看出两种典型语句模式:

  • print 语句:keyword(print) + string
  • var 赋值语句:keyword(var) + keyword_valueof + operator(eq) + string

我们可以根据token的type或value来识别语句的起始和结束,完成分组。

2. 代码实现

function tokensToCode(tokenData) {
  if (tokenData.error) return '';
  const tokens = tokenData.tokens;
  const codeLines = [];
  let i = 0;

  while (i < tokens.length) {
    const currentToken = tokens[i];
    // 处理print语句
    if (currentToken.value === 'print') {
      const printToken = currentToken.text;
      const stringToken = tokens[i + 1].text;
      codeLines.push(`${printToken} ${stringToken}`);
      i += 2; // 跳过当前print和后面的string
    } 
    // 处理var赋值语句
    else if (currentToken.value === 'var') {
      const varToken = currentToken.text;
      const varNameToken = tokens[i + 1].text;
      const operatorToken = tokens[i + 2].text;
      const stringToken = tokens[i + 3].text;
      codeLines.push(`${varToken} ${varNameToken} ${operatorToken} ${stringToken}`);
      i += 4; // 跳过var、变量名、运算符、字符串
    } 
    // 可扩展其他语句类型
    else {
      // 处理未知语句或单个token,这里直接跳过或按需调整
      i++;
    }
  }

  return codeLines.join('\n');
}

// 测试示例
const sampleTokenData = {
  "error": false,
  "tokens": [
    {"type": "keyword","value": "print","text": "print"},
    {"type": "string","value": "hello world","text": "\"hello world\""},
    {"type": "keyword","value": "var","text": "var"},
    {"type": "keyword_valueof","value": "msg","text": "msg"},
    {"type": "operator","value": "eq","text": "="},
    {"type": "string","value": "secret message","text": "\"secret message\""}
  ]
};

console.log(tokensToCode(sampleTokenData));

3. 代码说明

  • 遍历tokens数组,通过value识别语句类型,按固定的token数量分组(print占2个token,var赋值占4个)。
  • 每组内直接拼接各token的text字段,按目标格式添加空格。
  • 可根据后续新增的语句类型(比如if、for等)扩展else if分支,调整分组的token数量和拼接逻辑。

4. 注意事项

  • 如果分词器输出的string类型token的text不带引号(比如示例里写的是hello world而非"hello world"),需要在拼接时手动添加引号,比如"${stringToken}"。
  • 若存在更复杂的语句结构(比如表达式嵌套),可能需要用状态机或递归方式处理,而非简单的固定步长跳转。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:24:32