这段语义通过吗

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

按模型,ok([("set","x",["1"]), ("print",None,["x"])]) 交回什么?

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

declared 收集 set 定义过的名字,used 收集表达式里用到的名字,undefined 交回「用了却没定义」的名字,ok=没有未定义变量。

def kind(tok):
    if tok.lstrip("-").isdigit():
        return "num"
    if tok in ("+", "-", "*", "="):
        return "op"
    return "name"


def declared(prog):
    """prog: 已 parse 的语句列表;交回 set 定义过的变量名(按序)。"""
    return [n[1] for n in prog if n[0] == "set"]


def used(prog):
    """所有表达式里用到的变量名(按序、可重复)。"""
    names = []
    for n in prog:
        for t in n[2]:
            if kind(t) == "name":
                names.append(t)
    return names


def undefined(prog):
    """用到了、却没被 set 定义过的变量名(去重排序)。"""
    d = set(declared(prog))
    return sorted(set(u for u in used(prog) if u not in d))


def ok(prog):
    """有没有未定义变量(没有才算语义 OK)。"""
    return undefined(prog) == []

print(ok([("set", "x", ["1"]), ("print", None, ["x"])]))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论