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, 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