def convert_postfix_to_tree(stat): stack = [] r = re.compile('(~|&|\||=>|[A-Z][A-Z])') preds = r.findall(stat) for token in preds: if token in [operator['and'], operator['or'], operator['implies']]: operand2 = stack.pop() operand1 = stack.pop() op = DOM(token, preds_map) op.left = operand1 op.right = operand2 stack.append(op) elif token == operator['neg']: stack[-1].negated = not stack[-1].negated else: operand = DOM(token, preds_map) stack.append(operand) return stack[0]
def distribute_and_over_or(self, dom, preds_map): if dom: if dom.val == self.operator['or']: if dom.left.val == self.operator[ 'and'] and dom.right.val == self.operator['and']: left_and, right_and = dom.left, dom.right a, b, c, d = left_and.left, left_and.right, right_and.left, right_and.right a_copy, b_copy, c_copy, d_copy = copy.deepcopy( a), copy.deepcopy(b), copy.deepcopy(c), copy.deepcopy( d) left_or_1 = DOM(self.operator['or'], preds_map) left_or_2 = DOM(self.operator['or'], preds_map) right_or_1 = DOM(self.operator['or'], preds_map) right_or_2 = DOM(self.operator['or'], preds_map) dom.val = self.operator['and'] left_and.left, left_and.right, right_and.left, right_and.right = left_or_1, left_or_2, right_or_1, right_or_2 left_or_1.left, left_or_1.right = a, c left_or_2.left, left_or_2.right = a_copy, d right_or_1.left, right_or_1.right = b, c_copy right_or_2.left, right_or_2.right = b_copy, d_copy elif dom.left.op and not dom.right.op and dom.left.val == self.operator[ 'and']: c, a = dom.left.right, a = dom.right a_copy = copy.deepcopy(a) right_or = DOM(self.operator['or'], preds_map) dom.val = self.operator['and'] dom.left.val = self.operator['or'] dom.left.right = a dom.right = right_or right_or.left, right_or.right = c, a_copy elif not dom.left.op and dom.right.op and dom.right.val == self.operator[ 'and']: a = dom.left a_copy = copy.deepcopy(a) b = dom.right.left left_or = DOM(self.operator['or'], preds_map) dom.val = self.operator['and'] dom.right.val = self.operator['or'] dom.left = left_or left_or.left, left_or.right = a, b dom.right.left = a_copy self.distribute_and_over_or(dom.left, preds_map) self.distribute_and_over_or(dom.right, preds_map)