python 방문 자 모드 구현 (재 귀적 방식)

13525 단어 디자인 모드
class Node:
    """     """
    pass

class UnaryOperator(Node):
    """        """
    def __init__(self, operand):
        self.operand = operand
    
class BinaryOperator(Node):
    """        """
    def __init__(self, left, right):
        self.left = left
        self.right = right

class Number(Node):
    """     """
    def __init__(self, value):
        self.value = value

class Negate(UnaryOperator):
    """     """
    pass

class Add(BinaryOperator):
    """     """
    pass

class Sub(BinaryOperator):
    """     """
    pass

class Mul(BinaryOperator):
    """     """
    pass

class Div(BinaryOperator):
    """     """
    pass

class NodeVisitor:
    """      """
    def visit(self, node):
        #              
        meth_name = 'visit' + type(node).__name__
        #            meth
        meth = getattr(self, meth_name, None)
        #         ,          meth
        if meth is None:
            meth = self.regression
        #    meth        
        return meth(node)

    def regression(self, node):
        #     ,       
        raise RuntimeError('no such method {}'.format('visit' + type(node).__name__))

class Executor(NodeVisitor):
    """      """
    def visitNumber(self, node):
        #       ,      
        return node.value
    def visitNagate(self, node):
        #       ,       
        return -node.value
    def visitAdd(self, node):
        #       ,                  
        return self.visit(node.left) + self.visit(node.right)
    def visitSub(self, node):
        #       ,                  
        return self.visit(node.left) - self.visit(node.right)
    def visitMul(self, node):
        #       ,                  
        return self.visit(node.left) * self.visit(node.right)
    def visitDiv(self, node):
        #       ,                  
        return self.visit(node.left) / self.visit(node.right)

def main():
	t1 = Sub(Number(2), Number(1))
	t2 = Mul(Number(3), t1)
	t3 = Add(Number(5), t2)
	t4 = Div(t3, Number(5))
	# t4 = ((5 + (3 * (2 - 1))) / 5) = 1.6
	executor = Executor()
    #           t4,     
	print(executor.visit(t4))

if __name__ == "__main__":
    main()

좋은 웹페이지 즐겨찾기