From 24504949fc0936fab8df418b8d7e4b9134a55707 Mon Sep 17 00:00:00 2001 From: RemiZOffAlex Date: Sat, 21 Mar 2026 00:50:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20executor/visitor.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- executor/visitor.py | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 executor/visitor.py 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)