Python后缀表达式多位数解析器实现及TypeError报错问题求助
后缀表达式计算问题修复及多位数支持方案
报错修复
你遇到的类型错误由两个错误逻辑共同导致:
- 你定义的
parser函数设计为接收单个字符作为入参,但调用时直接传入了完整的表达式字符串,同时函数内部依赖全局变量token存储数字缓冲,状态完全不受控。 - 你将
parser返回的生成器对象直接覆盖了原本存储表达式字符串的data变量,后续代码执行xxx in data判断时,左侧是字符串、右侧是生成器,直接触发类型错误。
修复后的Token解析实现
不需要写复杂的BNF解析器,以下实现即可同时解决报错和多位数支持需求:
def tokenize(expr: str): num_buffer = [] # 遍历表达式所有字符 for c in expr: # 数字存入缓冲 if c.isdigit(): num_buffer.append(c) else: # 遇到非数字先输出缓冲中的完整数字 if num_buffer: yield int(''.join(num_buffer)) num_buffer.clear() # 运算符直接作为单独Token输出 if c in "+-*": yield c # 遍历结束后输出最后一段数字缓冲 if num_buffer: yield int(''.join(num_buffer))
调用代码调整
stack = Stack() # 传入原始表达式字符串获取Token流,不要覆盖原data变量 tokens = tokenize(data) for token in tokens: if isinstance(token, int): stack.push(token) # 此处保留你原有运算符计算逻辑即可
多位数支持说明
上述实现默认支持多位数解析:
- 连续出现的数字会被全部收集到缓冲中,直到遇到运算符、表达式结束才会拼接为整数输出
- 兼容带/不带空格的后缀表达式格式,比如
123 456 +、123+456都可以正确解析为对应Token
可选优化
- 增加空格兼容逻辑:遍历字符时如果遇到空格直接跳过,不做任何处理即可
- 如果需要支持小数,只需要在数字判断逻辑中增加对
.的识别和特殊处理 - 所有缓冲逻辑都放在函数内部,不会出现多次调用状态残留的问题
内容的提问来源于stack exchange,提问作者TheUselessProgrammer
相关产品推荐
相关产品推荐

