diff --git a/executor/visitor.py b/executor/visitor.py new file mode 100644 index 0000000..c7c22ed --- /dev/null +++ b/executor/visitor.py @@ -0,0 +1,46 @@ +__author__ = 'RemiZOffAlex' +__email__ = 'remizoffalex@mail.ru' + + +class Visitor: + def __init__(self, methods: dict = {}): + self.__methods = methods + + def register(self, name, handler): + self.__methods[name] = handler + + def visit(self, node, *args, **kwargs): + if 'kind' in node: + name = node['kind'] + else: + raise ValueError('Node is empty') + method = self.__methods.get(name, self.__class__.generic_visit) + result = method(self, node, *args, **kwargs) + return result + + def generic_visit(self, node, *args, **kwargs): + """Called if no explicit visitor function exists for a node.""" + method = node['kind'] + raise NotImplementedError('No visitor method {method} was defined for this expression: {node}'.format( + method=method, + node=node + )) + + def __getattr__(self, name): + raise AttributeError('Вызван несуществующий метод {name}'.format(name=name)) + + def __getitem__(self, key): + method = self.__methods[key] + return method + + def __iter__(self): + return iter(self.__methods) + + def __len__(self): + return len(self.__methods) + + def __delitem__(self, key): + del self.__methods[key] + + def __repr__(self): + return repr(self.__methods)