自定义语言转JavaScript脚本适配多行输入输出的修改方案
自定义语言转JS脚本的多行输入输出支持修改方案
1. 输入分割与逐行处理逻辑
首先要将输入文本按换行符分割为独立行,兼容Windows(\r\n)和Unix(\n)的换行格式。在入口函数(比如update)中,将原有的整体文本处理改为遍历每行单独处理:
function update(input) { // 分割输入为行数组 const inputLines = input.split(/\r?\n/); // 逐行转换 const outputLines = inputLines.map(line => { // 保留空行格式 if (!line.trim()) return ''; // 调用原有处理流程处理单行 const tokens = lexer(line); const ast = parse(tokens); return convert(ast); }); // 用换行符拼接输出结果 out(outputLines.join('\n')); }
2. 适配词法分析器(Lexer)
确保lexer函数可以正确处理单行文本,避免依赖多行上下文(如果原设计没有跨多行token的话)。如果原lexer是针对整体文本写的,只需确认它不会把换行符当作有效token,或者在处理单行时自动忽略换行符(因为已经提前分割了行)。
3. 适配语法分析器(Parser)
修改parse函数,使其能够处理单行对应的token流,生成独立的语句AST节点。如果原parser是处理整个文档的AST,现在要调整为支持单个语句的AST生成——比如原来的根节点是Program包含多个Statement,现在可以对每行生成一个Statement,最后再组合成完整的Program(或者直接逐行转换)。
4. 转换函数(Convert)的适配
确保convert函数可以正确转换单个语句的AST为对应的JS代码,而不是仅支持整个文档的转换。比如原convert接收整个Program AST,现在可以让它支持接收单个Statement AST,输出单行JS代码。
5. 空行与格式保持
在处理过程中保留输入的空行,避免输出丢失格式。比如在逐行处理时,遇到空行直接返回空字符串,最终拼接时会保留对应的换行。
扩展:支持跨多行的自定义语言语句
如果你的自定义语言存在跨多行的语法(比如多行函数定义、多行字符串),还需要额外修改:
- 在
lexer中添加多行token的识别逻辑(比如检测未闭合的字符串或块,继续读取下一行) - 在
parser中处理跨多行的AST结构,确保多行内容被解析为一个完整的节点
内容的提问来源于stack exchange,提问作者Vatsa Pandey
相关产品推荐
相关产品推荐

