Newer
Older
NewLang / interp.py
# 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 verb_Append(self, args):
        appendix = args[0]
        return Text(self.value() + " " + appendix.value())

class Module_System:
    def verb_Print(self, args):
        print(args[0].value())

    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))

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_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": Module_System(),
    }
    for command in ast:
        run_command(env, command)