Python自制解释器变量赋值异常:存储EQUALS而非变量值
问题定位与修复方案
核心问题
变量赋值错误的根源在parse函数的赋值处理分支:
- 调用
doASSIGN时,错误地将EQUALS这个token(toks[i+1])作为变量值传入,实际应传入赋值符号右侧的STRING/NUM/EXPRtoken(toks[i+2])。 - 处理表达式赋值时,
doASSIGN的参数传递完全错误,既未传入变量名,也未正确传递表达式结果。
修复步骤
- 修正赋值参数传递:在所有赋值分支中,将
doASSIGN的第二个参数从toks[i+1]改为toks[i+2]。 - 修复表达式赋值逻辑:先计算表达式结果,再将变量名和计算后的值正确传入
doASSIGN。 - 可选优化:如果希望变量存储实际内容(比如
"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
相关产品推荐
相关产品推荐

