You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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', '(', ')', ';']

代码解释

  1. 符号列表改用集合:集合的成员查找速度远快于列表,同时自动去重了原列表里重复的,
  2. 循环迭代处理:通过while循环持续处理当前子串,直到子串完全处理完毕
  3. 精准定位第一个符号:遍历当前子串的每个字符,找到最先出现的符号位置和符号本身,避免遗漏多符号场景
  4. 逐步拆分添加:
    • 如果符号不在子串开头,先把符号左侧的有效内容加入列表
    • 单独加入符号元素
    • 把符号右侧的剩余内容作为新的处理对象,继续循环拆分

这个方案不仅能解决你给出的示例场景,还能处理更复杂的多符号连续出现的情况,比如x+y*z;会被拆成['x', '+', 'y', '*', 'z', ';'],完全适配Nand2Tetris编译器的token拆分需求。

内容的提问来源于stack exchange,提问作者Daniel Sapir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:01:55