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): # 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
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
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
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
def __init__(self, *children): Form.__init__(self, *children)