@classmethod defget_start_node(cls, formula_dict): for key, value in formula_dict.items(): if value.data['origin']['name'] == '=': left_node = formula_dict.get(value.data['origin']['left']) right_node = formula_dict.get(value.data['origin']['right']) return left_node if left_node.data['origin'].get('operator') else right_node returnNone
defprocess(self): if self.expression and'('notin self.expression: return # 搜索 left 和 right 的最低优先级 X,Y, # 如果 X 优先级小于 start_node 的优先级,那么 X 需要括号 # 否则,不需要括号 # 对于 Y 同理 # 只在一个分支上检查level # 特例 / - 右边分支如果有同级的 需要带括号 # 括号内部 非括号部分的优先级 self.fill_node_bracket(self.start_node)
defensure_bracket(self, child_bracket): ifnot child_bracket: return self.small_bracket child_bracket_order = self.brackets[child_bracket] for bracket, order in self.brackets.items(): if order > child_bracket_order: return bracket returnNone
deffind_child_bracket(self, node): ifnot node: return bracket = node.data['origin'].get('bracket') if node.data['origin']['left'] != -1: left_bracket = self.find_child_bracket(self.formula_dict.get(node.data['origin']['left'])) if left_bracket: ifnot bracket: bracket = left_bracket else: bracket = left_bracket if self.brackets[left_bracket] > self.brackets[bracket] else bracket if node.data['origin']['right'] != -1: right_bracket = self.find_child_bracket(self.formula_dict.get(node.data['origin']['right'])) if right_bracket: ifnot bracket: bracket = right_bracket else: bracket = right_bracket if self.brackets[right_bracket] > self.brackets[bracket] else bracket return bracket