def apply(self, element):
        # p < n
        form = element.parent
        ops = [element]
        p = element.prev
        n = element.next
        args = [p, n]
        form.remove(p) # < n
        form.remove(n) # <
        new_form = Form(Identifier(self.head_symbol_name))
        new_form_element = form.replace(element, new_form) # (head_symbol)

        while True: # while we find + e
            e1 = new_form_element.next
            if e1 is None: break
            e2 = e1.next
            if e2 is None: break
            if is_identifier(e1.code) and e1.code.name in self.sym_vals: # if e1 is the same symbol as e, then it is the same operator
                form.remove(e1)
                form.remove(e2)
                ops.append(e1)
                args.append(e2)
            else: break

        for op in ops:
            new_form.append(op)

        new_form.append(Seq(*args))

        return new_form_element.next
示例#2
0
    def apply(self, element):
        # p + n
        # + p n
        # (+ p n)
        form = element.parent
        head = element.code
        p = element.prev
        n = element.next
        form.remove(p) # + n
        form.remove(n) # +
        new_form = Form(head, p, n) # +      (+ p n)
        new_form_element = form.replace(element, new_form) # (+ p n)

        while True: # while we find + e
            e1 = new_form_element.next
            if e1 is None: break
            e2 = e1.next
            if e2 is None: break
            if is_identifier(e1.code, head.name): # if e1 is the same symbol as e, then it is the same operator
                form.remove(e1)
                form.remove(e2)
                new_form.append(e2) # so we add the next element as an operand
            else: break

        return new_form_element.next
示例#3
0
    def apply(self, element):
        # p < n
        form = element.parent
        ops = [element]
        p = element.prev
        n = element.next
        args = [p, n]
        form.remove(p)  # < n
        form.remove(n)  # <
        new_form = Form(Identifier(self.head_symbol_name))
        new_form_element = form.replace(element, new_form)  # (head_symbol)

        while True:  # while we find + e
            e1 = new_form_element.next
            if e1 is None: break
            e2 = e1.next
            if e2 is None: break
            if is_identifier(
                    e1.code
            ) and e1.code.name in self.sym_vals:  # if e1 is the same symbol as e, then it is the same operator
                form.remove(e1)
                form.remove(e2)
                ops.append(e1)
                args.append(e2)
            else:
                break

        for op in ops:
            new_form.append(op)

        new_form.append(Seq(*args))

        return new_form_element.next