Esempio n. 1
0
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]
Esempio n. 2
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)