47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
__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)
|