Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
实时编辑器
折叠未更改行
关闭换行
视图
拆分
统一
比对精度
智能
单词
字符
语法高亮
选择语法
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
Interpreter Environment Change Diff
创建于
5年前
差异永不过期
清除
导出
分享
解释
17 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
113 行
全部复制
11 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
111 行
全部复制
# Top level function that interprets an entire program. It creates the
# Top level function that interprets an entire program. It creates the
# initial environment that's used for storing variables.
# initial environment that's used for storing variables.
def interpret_program(model):
def interpret_program(model):
# Make the initial environment (a dict). The environment is
# Make the initial environment (a dict). The environment is
# where you will create and store variables.
# where you will create and store variables.
复制
已复制
复制
已复制
env = {
'constants':{}, 'variables':{}
}
env = {
}
for structure in model.statements:
for structure in model.statements:
interpret(structure, env)
interpret(structure, env)
# Internal function to interpret a node in the environment. You need
# Internal function to interpret a node in the environment. You need
# to expand to cover all of the classes in the model.py file.
# to expand to cover all of the classes in the model.py file.
def interpret(node, env):
def interpret(node, env):
# Expand to check for different node types
# Expand to check for different node types
if isinstance(node, Integer):
if isinstance(node, Integer):
return int(node.value)
return int(node.value)
elif isinstance(node, Float):
elif isinstance(node, Float):
return node.value
return node.value
elif isinstance(node, BinaryOperator):
elif isinstance(node, BinaryOperator):
if node.op == '*':
if node.op == '*':
return interpret(node.left, env) * interpret(node.right, env)
return interpret(node.left, env) * interpret(node.right, env)
elif node.op == '/':
elif node.op == '/':
return interpret(node.left, env) / interpret(node.right, env)
return interpret(node.left, env) / interpret(node.right, env)
elif node.op == '+':
elif node.op == '+':
return interpret(node.left, env) + interpret(node.right, env)
return interpret(node.left, env) + interpret(node.right, env)
elif node.op == '-':
elif node.op == '-':
return interpret(node.left, env) - interpret(node.right, env)
return interpret(node.left, env) - interpret(node.right, env)
elif isinstance(node, Comparison):
elif isinstance(node, Comparison):
if node.op == '>':
if node.op == '>':
return interpret(node.left, env) > interpret(node.right, env)
return interpret(node.left, env) > interpret(node.right, env)
elif node.op == '<':
elif node.op == '<':
return interpret(node.left, env) < interpret(node.right, env)
return interpret(node.left, env) < interpret(node.right, env)
elif node.op == '==':
elif node.op == '==':
return interpret(node.left, env) == interpret(node.right, env)
return interpret(node.left, env) == interpret(node.right, env)
elif node.op == '>=':
elif node.op == '>=':
return interpret(node.left, env) >= interpret(node.right, env)
return interpret(node.left, env) >= interpret(node.right, env)
elif node.op == '<=':
elif node.op == '<=':
return interpret(node.left, env) <= interpret(node.right, env)
return interpret(node.left, env) <= interpret(node.right, env)
elif node.op == '!=':
elif node.op == '!=':
return interpret(node.left, env) != interpret(node.right, env)
return interpret(node.left, env) != interpret(node.right, env)
elif isinstance(node, Print):
elif isinstance(node, Print):
print(interpret(node.value, env))
print(interpret(node.value, env))
elif isinstance(node, VariableAssignment):
elif isinstance(node, VariableAssignment):
复制
已复制
复制
已复制
# if node.type.string_representation == the start of type checking
env[
str(node.name)] =
{"value":
interpret(node.value, env)
, "mutable": True}
env[
'variables'][
str(node.name)] =
interpret(node.value, env)
return Unit()
return Unit()
elif isinstance(node, ConstantAssignment):
elif isinstance(node, ConstantAssignment):
复制
已复制
复制
已复制
env[
'constants'][
str(node.name)] =
interpret(node.value, env)
env[
str(node.name)] =
{"value":
interpret(node.value, env)
, "mutable": False}
return Unit()
return Unit()
elif isinstance(node, VariableDeclaration):
elif isinstance(node, VariableDeclaration):
复制
已复制
复制
已复制
env[
'variables'][
str(node.name)] =
"WABBITASSIGNMENTINWAITING"
env[
str(node.name)] =
{"value": None, "mutable": True}
return Unit()
return Unit()
elif isinstance(node, VariableReAssignment):
elif isinstance(node, VariableReAssignment):
复制
已复制
复制
已复制
if str(node.name) in env
['variables']
.keys():
if str(node.name) in env
.keys():
env['variables'][str(node.name)] = interpret(node.value, env)
if not env[str(node.name)]['mutable']:
elif str(node.name) in env['constants'].keys():
raise RuntimeError("Cannot reassign the value of a constant")
raise RuntimeError("Cannot reassign the value of a constant")
else:
env[str(node.name)] = interpret(node.value, env)
else:
else:
raise RuntimeError(f"{node.name} not found for reassignment")
raise RuntimeError(f"{node.name} not found for reassignment")
return Unit()
return Unit()
elif isinstance(node, Name):
elif isinstance(node, Name):
复制
已复制
复制
已复制
if node.name in env
['variables']
.keys():
if node.name in env
.keys():
return env
['variables']
.get(node.name)
return env
.get(node.name)
.get(
'value'
)
elif node.name in env['constants'].keys():
return env['constants']
.get(
str(node.name)
)
else:
else:
raise RuntimeError(f"'{node.name}' not defined")
raise RuntimeError(f"'{node.name}' not defined")
elif isinstance(node, Negative):
elif isinstance(node, Negative):
# gotta check if its type that can be negative
# gotta check if its type that can be negative
return interpret(node.value, env) * -1
return interpret(node.value, env) * -1
elif isinstance(node, Conditional):
elif isinstance(node, Conditional):
if interpret(node.if_condition, env):
if interpret(node.if_condition, env):
result = interpret(node.if_block, env)
result = interpret(node.if_block, env)
if isinstance(result, Break):
if isinstance(result, Break):
return Break()
return Break()
else:
else:
if node.else_block:
if node.else_block:
result = interpret(node.else_block, env)
result = interpret(node.else_block, env)
if isinstance(result, Break):
if isinstance(result, Break):
return Break()
return Break()
elif isinstance(node, WhileLoop):
elif isinstance(node, WhileLoop):
if interpret(node.while_condition, env):
if interpret(node.while_condition, env):
result = interpret(node.while_block, env)
result = interpret(node.while_block, env)
if not isinstance(result, Break):
if not isinstance(result, Break):
interpret(node, env)
interpret(node, env)
else:
else:
return Unit()
return Unit()
elif isinstance(node, Block):
elif isinstance(node, Block):
for statement in node.statements:
for statement in node.statements:
maybe_flow_interruptor = interpret(statement, env)
maybe_flow_interruptor = interpret(statement, env)
if isinstance(maybe_flow_interruptor, Continue):
if isinstance(maybe_flow_interruptor, Continue):
return Unit()
return Unit()
elif isinstance(maybe_flow_interruptor, Break):
elif isinstance(maybe_flow_interruptor, Break):
return Break()
return Break()
return Unit()
return Unit()
elif isinstance(node, CompoundExpression):
elif isinstance(node, CompoundExpression):
final_statement = None
final_statement = None
for statement in node.statements:
for statement in node.statements:
final_statement = interpret(statement, env)
final_statement = interpret(statement, env)
return final_statement
return final_statement
elif isinstance(node, Break):
elif isinstance(node, Break):
return Break()
return Break()
elif isinstance(node, Continue):
elif isinstance(node, Continue):
return Continue()
return Continue()
elif isinstance(node, WabbitType):
elif isinstance(node, WabbitType):
return Unit()
return Unit()
elif isinstance(node, WabbitBoolean):
elif isinstance(node, WabbitBoolean):
return node.value
return node.value
elif isinstance(node, Character):
elif isinstance(node, Character):
return str(node.value)
return str(node.value)
else:
else:
raise RuntimeError(f"Can't interpret {node}")
raise RuntimeError(f"Can't interpret {node}")
已保存差异
原始文本
打开文件
# Top level function that interprets an entire program. It creates the # initial environment that's used for storing variables. def interpret_program(model): # Make the initial environment (a dict). The environment is # where you will create and store variables. env = {'constants':{}, 'variables':{}} for structure in model.statements: interpret(structure, env) # Internal function to interpret a node in the environment. You need # to expand to cover all of the classes in the model.py file. def interpret(node, env): # Expand to check for different node types if isinstance(node, Integer): return int(node.value) elif isinstance(node, Float): return node.value elif isinstance(node, BinaryOperator): if node.op == '*': return interpret(node.left, env) * interpret(node.right, env) elif node.op == '/': return interpret(node.left, env) / interpret(node.right, env) elif node.op == '+': return interpret(node.left, env) + interpret(node.right, env) elif node.op == '-': return interpret(node.left, env) - interpret(node.right, env) elif isinstance(node, Comparison): if node.op == '>': return interpret(node.left, env) > interpret(node.right, env) elif node.op == '<': return interpret(node.left, env) < interpret(node.right, env) elif node.op == '==': return interpret(node.left, env) == interpret(node.right, env) elif node.op == '>=': return interpret(node.left, env) >= interpret(node.right, env) elif node.op == '<=': return interpret(node.left, env) <= interpret(node.right, env) elif node.op == '!=': return interpret(node.left, env) != interpret(node.right, env) elif isinstance(node, Print): print(interpret(node.value, env)) elif isinstance(node, VariableAssignment): # if node.type.string_representation == the start of type checking env['variables'][str(node.name)] = interpret(node.value, env) return Unit() elif isinstance(node, ConstantAssignment): env['constants'][str(node.name)] = interpret(node.value, env) return Unit() elif isinstance(node, VariableDeclaration): env['variables'][str(node.name)] = "WABBITASSIGNMENTINWAITING" return Unit() elif isinstance(node, VariableReAssignment): if str(node.name) in env['variables'].keys(): env['variables'][str(node.name)] = interpret(node.value, env) elif str(node.name) in env['constants'].keys(): raise RuntimeError("Cannot reassign the value of a constant") else: raise RuntimeError(f"{node.name} not found for reassignment") return Unit() elif isinstance(node, Name): if node.name in env['variables'].keys(): return env['variables'].get(node.name) elif node.name in env['constants'].keys(): return env['constants'].get(str(node.name)) else: raise RuntimeError(f"'{node.name}' not defined") elif isinstance(node, Negative): # gotta check if its type that can be negative return interpret(node.value, env) * -1 elif isinstance(node, Conditional): if interpret(node.if_condition, env): result = interpret(node.if_block, env) if isinstance(result, Break): return Break() else: if node.else_block: result = interpret(node.else_block, env) if isinstance(result, Break): return Break() elif isinstance(node, WhileLoop): if interpret(node.while_condition, env): result = interpret(node.while_block, env) if not isinstance(result, Break): interpret(node, env) else: return Unit() elif isinstance(node, Block): for statement in node.statements: maybe_flow_interruptor = interpret(statement, env) if isinstance(maybe_flow_interruptor, Continue): return Unit() elif isinstance(maybe_flow_interruptor, Break): return Break() return Unit() elif isinstance(node, CompoundExpression): final_statement = None for statement in node.statements: final_statement = interpret(statement, env) return final_statement elif isinstance(node, Break): return Break() elif isinstance(node, Continue): return Continue() elif isinstance(node, WabbitType): return Unit() elif isinstance(node, WabbitBoolean): return node.value elif isinstance(node, Character): return str(node.value) else: raise RuntimeError(f"Can't interpret {node}")
更改后文本
打开文件
# Top level function that interprets an entire program. It creates the # initial environment that's used for storing variables. def interpret_program(model): # Make the initial environment (a dict). The environment is # where you will create and store variables. env = {} for structure in model.statements: interpret(structure, env) # Internal function to interpret a node in the environment. You need # to expand to cover all of the classes in the model.py file. def interpret(node, env): # Expand to check for different node types if isinstance(node, Integer): return int(node.value) elif isinstance(node, Float): return node.value elif isinstance(node, BinaryOperator): if node.op == '*': return interpret(node.left, env) * interpret(node.right, env) elif node.op == '/': return interpret(node.left, env) / interpret(node.right, env) elif node.op == '+': return interpret(node.left, env) + interpret(node.right, env) elif node.op == '-': return interpret(node.left, env) - interpret(node.right, env) elif isinstance(node, Comparison): if node.op == '>': return interpret(node.left, env) > interpret(node.right, env) elif node.op == '<': return interpret(node.left, env) < interpret(node.right, env) elif node.op == '==': return interpret(node.left, env) == interpret(node.right, env) elif node.op == '>=': return interpret(node.left, env) >= interpret(node.right, env) elif node.op == '<=': return interpret(node.left, env) <= interpret(node.right, env) elif node.op == '!=': return interpret(node.left, env) != interpret(node.right, env) elif isinstance(node, Print): print(interpret(node.value, env)) elif isinstance(node, VariableAssignment): env[str(node.name)] = {"value": interpret(node.value, env), "mutable": True} return Unit() elif isinstance(node, ConstantAssignment): env[str(node.name)] = {"value": interpret(node.value, env), "mutable": False} return Unit() elif isinstance(node, VariableDeclaration): env[str(node.name)] = {"value": None, "mutable": True} return Unit() elif isinstance(node, VariableReAssignment): if str(node.name) in env.keys(): if not env[str(node.name)]['mutable']: raise RuntimeError("Cannot reassign the value of a constant") else: env[str(node.name)] = interpret(node.value, env) else: raise RuntimeError(f"{node.name} not found for reassignment") return Unit() elif isinstance(node, Name): if node.name in env.keys(): return env.get(node.name).get('value') else: raise RuntimeError(f"'{node.name}' not defined") elif isinstance(node, Negative): # gotta check if its type that can be negative return interpret(node.value, env) * -1 elif isinstance(node, Conditional): if interpret(node.if_condition, env): result = interpret(node.if_block, env) if isinstance(result, Break): return Break() else: if node.else_block: result = interpret(node.else_block, env) if isinstance(result, Break): return Break() elif isinstance(node, WhileLoop): if interpret(node.while_condition, env): result = interpret(node.while_block, env) if not isinstance(result, Break): interpret(node, env) else: return Unit() elif isinstance(node, Block): for statement in node.statements: maybe_flow_interruptor = interpret(statement, env) if isinstance(maybe_flow_interruptor, Continue): return Unit() elif isinstance(maybe_flow_interruptor, Break): return Break() return Unit() elif isinstance(node, CompoundExpression): final_statement = None for statement in node.statements: final_statement = interpret(statement, env) return final_statement elif isinstance(node, Break): return Break() elif isinstance(node, Continue): return Continue() elif isinstance(node, WabbitType): return Unit() elif isinstance(node, WabbitBoolean): return node.value elif isinstance(node, Character): return str(node.value) else: raise RuntimeError(f"Can't interpret {node}")
查找差异