Nand2Tetris编译器任务:字符串特定符号拆分代码修复求助
修复Nand2Tetris的符号拆分代码
首先你的初始代码存在几个关键问题:
- 只能处理token中第一个出现的单个符号,如果一个token里有多个符号(比如
run();包含(、)、;),剩下的符号会被留在拆分后的子串里,无法继续拆分 - 没有处理拆分后的子串可能仍包含符号的情况,导致漏处理
- 符号列表
Symbollst里有重复的,,虽然不报错,但会增加无意义的判断
修复思路
我们需要循环处理每个token,直到该token中不再包含任何符号为止。对于每个token,找到其中最早出现的符号,拆分后把左边的内容、符号本身加入列表,然后把右边的内容作为新的token继续处理,直到没有符号剩余。
修复后的代码
# 改用集合去重,同时提升符号查找效率 Symbollst = {'{', '}', '(', ')', '[', ']', '.', ',', ';', '+', '-', '*', '/', '&', '<', '>', '=', '~'} def split_tokens(input_str): TokenList = [] current_token = input_str while current_token: # 定位当前token中第一个出现的符号 first_symbol_pos = None first_symbol = None for idx, char in enumerate(current_token): if char in Symbollst: first_symbol_pos = idx first_symbol = char break if first_symbol_pos is None: # 没有符号,直接加入列表后退出循环 TokenList.append(current_token) break # 符号左侧有内容的话,先加入列表 if first_symbol_pos > 0: TokenList.append(current_token[:first_symbol_pos]) # 加入符号本身 TokenList.append(first_symbol) # 把符号右侧的内容作为新token继续处理 current_token = current_token[first_symbol_pos + 1:] return TokenList # 测试示例 test_str = 'game.run();' print(split_tokens(test_str)) # 输出: ['game', '.', 'run', '(', ')', ';']
代码解释
- 符号列表改用集合:集合的成员查找速度远快于列表,同时自动去重了原列表里重复的
, - 循环迭代处理:通过
while循环持续处理当前子串,直到子串完全处理完毕 - 精准定位第一个符号:遍历当前子串的每个字符,找到最先出现的符号位置和符号本身,避免遗漏多符号场景
- 逐步拆分添加:
- 如果符号不在子串开头,先把符号左侧的有效内容加入列表
- 单独加入符号元素
- 把符号右侧的剩余内容作为新的处理对象,继续循环拆分
这个方案不仅能解决你给出的示例场景,还能处理更复杂的多符号连续出现的情况,比如x+y*z;会被拆成['x', '+', 'y', '*', 'z', ';'],完全适配Nand2Tetris编译器的token拆分需求。
内容的提问来源于stack exchange,提问作者Daniel Sapir
相关产品推荐
相关产品推荐

