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, y):
        form = y.parent
        c = y.next
        b = y.prev
        x = b.prev
        a = x.prev

        form.remove(a)
        form.remove(b)
        form.remove(y)
        form.remove(c)
        new_form = Form(x, b, a, Form(y, c))

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

        return new_form_element.prev
示例#6
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
    def apply(self, element):
        form = element.parent
        p = element.prev
        n = element.next
        nn = n.next
        form.remove(p)
        form.remove(n)
        form.remove(nn)
        head = Identifier(element.code.name + n.code.name)
        head.range.update(element.code.range)
        head.range.update(n.code.range)
        new_form = Form(head, p, nn)
        new_form_element = form.replace(element, new_form)

        return new_form_element.next
示例#8
0
 def __init__(self, *children):
     Form.__init__(self, *children)