Добавить executor/visitor.py
Test Actions / Builder (push) Successful in 8s

This commit is contained in:
2026-03-21 00:50:02 +03:00
parent 1831384d1f
commit 24504949fc
+46
View File
@@ -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)