# SPDX-License-Identifier: MIT # Copyright 2021 Jookia <contact@jookia.org> import ast_types class Text: def __init__(self, value): self._value = value def __repr__(self): return "Text('%s')" % (self._value) def value(self): return self._value def Append(self, args): appendix = args[0] return Text(self.value() + " " + appendix.value()) def module_create(verbs): return ("module", verbs) def module_dispatch(object, verb, args): (type, functions) = object return functions[verb](object, args) def do_system_print(subject, args): print(args[0].value()) return None def do_system_read(subject, args): return Text(input()) system_module = module_create({ "Print": do_system_print, "Read": do_system_read, }) 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)) 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)) if subject.__class__ == Text: return getattr(subject, ast.verb)(args) elif subject[0] == "module": return module_dispatch(subject, ast.verb, args) return None def run_set(env, ast): env[ast.subject] = run_statement(env, ast.statement) return env[ast.subject] def run_conditional(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)) return None def run_ast(ast): env = { "System": system_module, } for command in ast: run_command(env, command)