JS开发玩具编程语言标签输出undefined及多行追加问题
问题原因排查
你遇到的两个问题根源非常明确:
undefined前缀:labels初始为空对象,第一次执行labels[label.slice(0, -1)] += xxx时,目标属性还不存在,默认值是undefined。JS做字符串拼接时会自动把undefined转成字符串"undefined",再拼接后续内容,自然就出现了异常前缀。- 只能拿到标签下一行、拿不到所有后续行:现有逻辑只在识别到标签行时,硬编码取了
CodeLine[i+1]也就是紧挨着标签的下一行拼接,没有维护「当前所属标签」的状态标记,根本没法持续收集后续行。 - 额外逻辑错误:代码里
instruction = CodeLine[1]取值完全错误,CodeLine是按换行分割的整行数组,CodeLine[1]永远是第二行的完整内容,和当前遍历到的行无关,这里应该取当前行拆分后的runCode[1]。
正确实现方案
核心调整点:
- 新增
currentLabel状态变量,初始为null,用来标记当前遍历位置所属的标签 - 识别到标签行时,先初始化对应标签的存储值为空字符串,更新
currentLabel为当前标签名,同时把标签行冒号后面自带的内容先存入 - 遍历非标签行时,如果
currentLabel不为空,就把当前行内容追加到对应标签的存储值中 - 遇到新标签时自动更新
currentLabel,后续行自动归属到新标签下
修正后的可运行代码:
var OBJcode = {} var labels = {} const code = `zhopa: i am string i am string i am string i am string testLabel: test content line1 test content line2` const CodeLine = code.split("\n") let currentLabel = null for (var i = 0; i < CodeLine.length; i++) { const line = CodeLine[i] const runCode = line.split(" ") OBJcode[i] = runCode // 修复原代码字段取值错误 const token0 = runCode[0] const instruction = runCode[1] const src = runCode[2] let dst = runCode[3] if (dst === undefined) { dst = src src = instruction } // 识别标签定义行 if (token0.endsWith(":")) { const labelName = token0.slice(0, -1) // 初始化空字符串避免undefined拼接 labels[labelName] = "" currentLabel = labelName // 存入标签行冒号后自带的内容 const inlineContent = runCode.slice(1).join(" ") if (inlineContent) { labels[labelName] += inlineContent } continue } // 处于标签作用域时追加当前行内容 if (currentLabel) { labels[currentLabel] += (labels[currentLabel] ? '\n' : '') + line } } console.log(code) console.log(OBJcode) console.log(labels)
运行后labels.zhopa的值就是标签后所有4行内容,不存在undefined前缀,多标签场景下也能正确把后续行归属到对应标签下。如果不需要保留换行格式,把追加内容时的'\n'去掉即可。
内容的提问来源于stack exchange,提问作者Сашенька Глинин
相关产品推荐
相关产品推荐

