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

Python自制解释器变量赋值异常:存储EQUALS而非变量值

问题定位与修复方案

核心问题

变量赋值错误的根源在parse函数的赋值处理分支:

  1. 调用doASSIGN时,错误地将EQUALS这个token(toks[i+1])作为变量值传入,实际应传入赋值符号右侧的STRING/NUM/EXPR token(toks[i+2])。
  2. 处理表达式赋值时,doASSIGN的参数传递完全错误,既未传入变量名,也未正确传递表达式结果。

修复步骤

  1. 修正赋值参数传递:在所有赋值分支中,将doASSIGN的第二个参数从toks[i+1]改为toks[i+2]。
  2. 修复表达式赋值逻辑:先计算表达式结果,再将变量名和计算后的值正确传入doASSIGN。
  3. 可选优化:如果希望变量存储实际内容(比如"variable"而非STRING: "variable"),可以在doASSIGN中添加类似doPRINT的解析逻辑。

修改后的关键代码片段

修正后的parse函数

def parse(toks):
    i = 0
    while(i < len(toks)):  # 修正循环边界,避免遗漏最后一组token
        if toks[i] + " " + toks[i+1][0:6] == "PRINT STRING" or toks[i] + " " + toks[i+1][0:3] == "PRINT NUM" or toks[i] + " " + toks[i+1][0:4] == "PRINT EXPR":
            if toks[i+1][0:6] == "STRING":
                doPRINT(toks[i+1])
            elif toks[i+1][0:3] == "NUM":
                doPRINT(toks[i+1])
            elif toks[i+1][0:4] == "EXPR":
                doPRINT(toks[i+1])
            i+= 2
        elif i+2 < len(toks) and (toks[i][0:3] + " " + toks[i+1] + " " + toks[i+2][0:6] == "VAR EQUALS STRING" or toks[i][0:3] + " " + toks[i+1] + " " + toks[i+2][0:3] == "VAR EQUALS NUM" or toks[i][0:3] + " " + toks[i+1] + " " + toks[i+2][0:4] == "VAR EQUALS EXPR"):
            if toks[i+2][0:6] == "STRING":
                doASSIGN(toks[i], toks[i+2])  # 修正为传入右侧的STRING token
            elif toks[i+2][0:3] == "NUM":
                doASSIGN(toks[i], toks[i+2])  # 修正为传入右侧的NUM token
            elif toks[i+2][0:4] == "EXPR":
                expr_val = evalExpression(toks[i+2][5:])
                doASSIGN(toks[i], f"NUM:{expr_val}")  # 正确传递变量名和计算后的表达式值
            i += 3
        else:
            i += 1  # 防止死循环,处理未匹配的token
    print(symbols)

可选:修改doASSIGN存储实际值

如果希望变量直接存储解析后的内容,而非带前缀的token:

def doASSIGN(varname, varvalue):
    var_key = varname[4:]
    if varvalue.startswith("STRING:"):
        symbols[var_key] = varvalue[8:-1]  # 提取字符串内容
    elif varvalue.startswith("NUM:"):
        symbols[var_key] = int(varvalue[4:])  # 转换为整数类型
    elif varvalue.startswith("EXPR:"):
        symbols[var_key] = evalExpression(varvalue[5:])
    else:
        symbols[var_key] = varvalue

修复后验证结果

运行修改后的代码处理test.lang,输出会变为:

hello world
55
48
{'var': 'variable'}  # 若使用可选解析逻辑,否则为{'var': 'STRING: "variable"'}

内容的提问来源于stack exchange,提问作者s.s.scriptties

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:45:58