哪个变量没定义
按模型,undefined([("print",None,["a"])]) 交回什么?
贯穿本节的小语言(判题机没 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(undefined([("print", None, ["a"])]))
全部评论