推一个表达式的类型
(每道题开头都有同一段:表达式用嵌套元组表示——("num",5) 是整数、("str","x") 字符串、("bool",True) 布尔、("var","x") 变量、("add",e1,e2) 相加、("eq",e1,e2) 相等、("if",c,e1,e2) 条件。type_of(e, env) 推它的类型,不合法交回 "ERR"。)
推 1 + 2 和 1 + "x" 的类型:
def type_of(e, env):
"""给表达式推类型:num→int、str→str、bool→bool、var 查 env、运算查操作数。不合法交回 "ERR"。"""
k = e[0]
if k == "num":
return "int"
if k == "str":
return "str"
if k == "bool":
return "bool"
if k == "var":
return env.get(e[1], "ERR")
if k == "add": # 同类型、且是 int 或 str 才能加
a = type_of(e[1], env)
b = type_of(e[2], env)
if a == b and a in ("int", "str"):
return a
return "ERR"
if k == "eq": # 同类型才能比,结果是 bool
a = type_of(e[1], env)
b = type_of(e[2], env)
if a != "ERR" and a == b:
return "bool"
return "ERR"
if k == "if": # 条件必 bool,两分支同类型
c = type_of(e[1], env)
a = type_of(e[2], env)
b = type_of(e[3], env)
if c == "bool" and a == b and a != "ERR":
return a
return "ERR"
return "ERR"
print(type_of(("add", ("num", 1), ("num", 2)), {}) + "/" + type_of(("add", ("num", 1), ("str", "x")), {}))
全部评论