Diff
checker
Text
Text
Bilder
Dokumente
Excel
Ordner
Legal
Enterprise
Desktop-App
Preise
Einloggen
Diffchecker Desktop herunterladen
Texte vergleichen
Finde den Unterschied zwischen zwei Textdateien
Werkzeuge
Verlauf
Live-Editor
Gleiches ausblenden
Zeilenumbruch aus
Ansicht
Zweispaltig
Einspaltig
Vergleichsgenauigkeit
Intelligent
Wort
Zeichen
Syntaxhervorhebung
Syntax auswählen
Ignorieren
Text umwandeln
Zur ersten Änderung
Eingabe bearbeiten
Diffchecker Desktop
Der sicherste Weg, Diffchecker zu nutzen. Hol dir die Desktop-App: Deine Diffs verlassen nie deinen Computer!
Desktop holen
Interpreter Environment Change Diff
Erstellt
vor 5 Jahren
Diff läuft nie ab
Löschen
Exportieren
Teilen
Erklären
17 Entfernungen
Zeilen
Gesamt
Entfernt
Zeichen
Gesamt
Entfernt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
113 Zeilen
Kopieren
11 Hinzufügungen
Zeilen
Gesamt
Hinzugefügt
Zeichen
Gesamt
Hinzugefügt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
111 Zeilen
Kopieren
# 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.
Kopieren
Kopiert
Kopieren
Kopiert
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):
Kopieren
Kopiert
Kopieren
Kopiert
# 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):
Kopieren
Kopiert
Kopieren
Kopiert
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):
Kopieren
Kopiert
Kopieren
Kopiert
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):
Kopieren
Kopiert
Kopieren
Kopiert
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):
Kopieren
Kopiert
Kopieren
Kopiert
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}")
Gespeicherte Diffs
Originaltext
Datei öffnen
# 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}")
Bearbeitung
Datei öffnen
# 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}")
Unterschied finden