diff --git a/interp.py b/interp.py index 606c082..f57cfc8 100644 --- a/interp.py +++ b/interp.py @@ -24,45 +24,50 @@ def verb_Read(self, args): return Text(input()) -def resolve_value(env, value): - if value.__class__ == ast_types.Reference: - return env[value.value] - elif value.__class__ == ast_types.Text: - return Text(value.value) - else: - print("Unimplemented value: %s" % (value)) +class Interpreter: + def resolve_value(self, env, value): + if value.__class__ == ast_types.Reference: + return env[value.value] + elif value.__class__ == ast_types.Text: + return Text(value.value) + else: + print("Unimplemented value: %s" % (value)) -def run_statement(env, ast): - subject = resolve_value(env, ast.subject) - if ast.verb == None: - return subject - args = [] - for arg in ast.arguments: - args.append(resolve_value(env, arg)) - return getattr(subject, "verb_" + ast.verb)(args) + def run_statement(self, env, ast): + subject = self.resolve_value(env, ast.subject) + if ast.verb == None: + return subject + args = [] + for arg in ast.arguments: + args.append(self.resolve_value(env, arg)) + return getattr(subject, "verb_" + ast.verb)(args) -def run_set(env, ast): - env[ast.subject] = run_statement(env, ast.statement) - return env[ast.subject] + def run_set(self, env, ast): + env[ast.subject] = self.run_statement(env, ast.statement) + return env[ast.subject] -def run_conditional(env, ast): - print("Unimplemented if") - return None + def run_conditional(self, env, ast): + print("Unimplemented if") + return None -def run_command(env, ast): - if ast.__class__ == ast_types.Statement: - return run_statement(env, ast) - elif ast.__class__ == ast_types.Set: - return run_set(env, ast) - elif ast.__class__ == ast_types.Conditional: - return run_conditional(env, ast) - else: - print("Unknown command %s" % (ast)) + def run_command(self, env, ast): + if ast.__class__ == ast_types.Statement: + return self.run_statement(env, ast) + elif ast.__class__ == ast_types.Set: + return self.run_set(env, ast) + elif ast.__class__ == ast_types.Conditional: + return self.run_conditional(env, ast) + else: + print("Unknown command %s" % (ast)) + return None + + def run(self, env, ast): + for command in ast: + self.run_command(env, command) return None def run_ast(ast): env = { "System": Module_System(), } - for command in ast: - run_command(env, command) + return Interpreter().run(env, ast)