从左到右连减

👁️ 3 人浏览 💬 0 人评论 ❤️ 添加收藏

按模型,eval_expr(["10","-","3","-","2"], {}) 交回几?

贯穿本节的小语言(判题机没 gcc,这是它的确定模型,见 spine.py):每行一条语句——set 名 = 表达式print 表达式;表达式是空格分隔的 token,从左到右求值(无优先级),数字 token 当值、名字到环境里查(没有当 0)。

val 取 token 的值,eval_expr 从左到右求值,run 执行整段(set 写环境、print 收进输出),result=最后一次 print 的值。

def val(tok, env):
    """token 取值:数字直接转 int,变量名到 env 里查(没有当 0)。"""
    if tok.lstrip("-").isdigit():
        return int(tok)
    return env.get(tok, 0)


def eval_expr(tokens, env):
    """表达式从左到右求值(无优先级):先取第一个,再依次 op 下一个。"""
    acc = val(tokens[0], env)
    i = 1
    while i + 1 < len(tokens):
        op = tokens[i]
        rhs = val(tokens[i + 1], env)
        acc = acc + rhs if op == "+" else (acc - rhs if op == "-" else acc * rhs)
        i += 2
    return acc


def run(prog, env):
    """执行已 parse 的语句:set 写 env、print 收进输出;交回输出列表。"""
    out = []
    for n in prog:
        if n[0] == "set":
            env[n[1]] = eval_expr(n[2], env)
        else:
            out.append(eval_expr(n[2], env))
    return out


def n_prints(prog):
    """程序里有几条 print。"""
    return sum(1 for n in prog if n[0] == "print")


def result(prog):
    """跑完后最后一次 print 的值(没有 print 交回 None)。"""
    o = run(prog, {})
    return o[-1] if o else None

print(eval_expr(["10", "-", "3", "-", "2"], {}))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论