JavaScript:如何从分词器的tokens数组提取text并格式化输出
实现方案
要完成从tokens数组提取text并整理成目标代码的功能,核心是按语句逻辑对tokens分组,再拼接每组的text内容。以下是具体实现步骤(以JavaScript为例):
1. 分析语句结构
从示例能看出两种典型语句模式:
print语句:keyword(print)+stringvar赋值语句: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
相关产品推荐
相关产品推荐

