如何在V语言中替换字符串内容?汇编器标签转地址实现求助
问题分析
你的代码目前存在两个核心问题:
- 标签地址计算错误:当前遍历所有行时都会递增
counter,导致标签关联的地址包含了标签行本身的位置,而实际标签应该标记的是后续指令的地址(或指令在code数组中的索引)。 - 指令未完成替换与重组:仅打印了标签对应的地址,但没有将原指令中的标签替换为地址并重新构建完整的指令行,最终返回的是空数组。
解决方案
以下是修正后的代码,实现了标签地址的正确计算和指令的替换重组:
module assembler pub fn assembler(source []string) []string { mut label := map[string]int{} mut counter := 0 mut code := []string{} // 第一遍遍历:解析标签,正确计算标签对应的指令地址 for line in source { trimmed_line := line.trim_space() if trimmed_line.ends_with(':') { // 提取标签名(去掉末尾的冒号) label_name := trimmed_line[0..trimmed_line.len-1] // 标签关联的是当前counter,也就是下一条指令的地址 label[label_name] = counter } else { if trimmed_line != '' { // 跳过空行 code << trimmed_line counter++ } } } // 第二遍遍历:替换指令中的标签为对应地址 mut result := []string{} for line in code { mut parts := line.split(' ') mut replaced_parts := []string{} for part in parts { // 检查当前部分是否是标签 if part in label { replaced_parts << label[part].str() } else { replaced_parts << part } } // 将替换后的部分重新拼接成指令行 result << replaced_parts.join(' ') } return result }
关键修改点说明
标签地址计算修正:
- 仅当处理非标签的指令行时,才递增
counter,确保标签关联的是后续指令的地址(即指令在code数组中的索引)。 - 使用
ends_with(':')更准确判断标签行,避免split('')的冗余操作;同时用trim_space()处理可能的空格,比如.main:这种带空格的标签行。
- 仅当处理非标签的指令行时,才递增
指令替换与重组:
- 对每条指令的各个部分逐一检查,将标签替换为对应的地址字符串。
- 用
join(' ')将替换后的部分重新拼接成完整的指令行,存入结果数组。
测试验证
运行你的main模块代码:
module main import assembler fn main() { res := assembler.assembler(['.main:', 'JMP .hlt', '.hlt:', 'HLT']) println(res) // 输出: ["JMP 1", "HLT"] }
执行后会得到你期望的输出:["JMP 1", "HLT"]。
内容的提问来源于stack exchange,提问作者JYL
相关产品推荐
相关产品推荐

