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

后缀表达式的Tokenizer与递归Parser返回错误结果,请求排查

后缀表达式递归解析器解析错误排查与修复

问题概述

你为后缀表达式实现了tokenizer和递归解析器,其中tokenizer功能正常,输出的tokens符合预期:

[('NUMBER', '2'), ('NUMBER', '3'), ('NUMBER', '4'), ('OPERATOR', '*'), ('OPERATOR', '+')]

但parse_expression函数返回的解析结果仅为2(预期为('+', 2, ('*', 3, 4))),最终计算结果为2(预期为14)。

错误原因

你的parse_expression函数逻辑存在根本性错误:它仅处理第一个token就直接返回,完全忽略了后续的操作数和运算符。

当调用parse_expression处理初始tokens列表时,第一个token是('NUMBER', '2'),函数直接返回整数2,不再处理剩余的[('NUMBER','3'), ('NUMBER','4'), ('OPERATOR','*'), ('OPERATOR','+')],这直接导致解析结果和计算结果不符合预期。

后缀表达式(逆波兰式)的核心语法规则是操作数 操作数 运算符,递归解析的逻辑需要适配这种“先操作数后运算符”的结构,而当前的递归实现并没有考虑后续token对当前操作数的依赖关系。

修复方案

后缀表达式最经典且可靠的处理方式是使用栈结构,以下是修改后的parse_expression函数:

def parse_expression(tokens):
    stack = []
    for token_type, value in tokens:
        if token_type == 'NUMBER':
            # 数字直接入栈
            stack.append(int(value))
        elif token_type == 'OPERATOR':
            # 运算符需要弹出最近的两个操作数
            if len(stack) < 2:
                raise ValueError("后缀表达式格式错误:运算符缺少足够操作数")
            right_operand = stack.pop()
            left_operand = stack.pop()
            # 将运算符和操作数组成表达式元组后入栈
            stack.append((value, left_operand, right_operand))
        else:
            raise ValueError(f"未知token类型:{token_type}")
    # 最终栈中应只剩一个完整表达式
    if len(stack) != 1:
        raise ValueError("后缀表达式格式错误:操作数与运算符数量不匹配")
    return stack[0]

验证结果

修改后运行main函数,输出结果如下:

Source code: 2 3 4 * +
Parsed expression: ('+', 2, ('*', 3, 4))
Result: 14

完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:52:48