This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user