def build_tree (cls, tokens): # Поиск главного понятия действия idx = 0 node = None root_node = None for token in tokens: if token.type == TokenType.concept: if token.concept.type == TokenConceptType.action: node = PropositionTreeNode () node.text = token.text node.type = PropositionTreeNodeType.concept node.side = PropositionTreeNodeSide.center node.concept = TreeNodeConcept () node.concept.id = token.concept.id node.concept.name = token.concept.name node.concept.type = token.concept.type root_node = node break idx += 1 if node == None: cls.__error_text = ErrorHelper.get_text (101) return None # Обработка левой ветки суждения i = idx - 1 while i >= 0: if tokens[i].type == TokenType.equal_sign: if tokens[i+1].type == TokenType.concept: node.concept.sublink = True else: parent_node = node node = PropositionTreeNode () node.parent = parent_node node.text = tokens[i].text if tokens[i].type == TokenType.concept: node.type = PropositionTreeNodeType.concept node.side = PropositionTreeNodeSide.left node.concept = TreeNodeConcept () node.concept.id = tokens[i].concept.id node.concept.name = tokens[i].concept.name node.concept.type = tokens[i].concept.type elif tokens[i].type == TokenType.linkage: node.type = PropositionTreeNodeType.linkage node.side = PropositionTreeNodeSide.left node.linkage = TreeNodeLinkage () node.linkage.id = tokens[i].linkage.id node.linkage.name = tokens[i].linkage.name elif tokens[i].type == TokenType.underscore: node.type = PropositionTreeNodeType.underscore elif tokens[i].type == TokenType.number: node.type = PropositionTreeNodeType.number elif tokens[i].type == TokenType.string: node.type = PropositionTreeNodeType.string #print node.text parent_node.children.append (node) i -= 1 # Обработка правой ветки суждения i = idx + 1 node = root_node level_inside_brackets = 0 common_parent = None while i < len (tokens): if tokens[i].type == TokenType.point: pass elif tokens[i].type == TokenType.question_mark: pass elif tokens[i].type == TokenType.opening_bracket: level_inside_brackets += 1 if node.type == PropositionTreeNodeType.concept: if level_inside_brackets > 1: cls.__push_common_parent (common_parent) common_parent = node elif node.type == PropositionTreeNodeType.linkage: b = 1 subtree_tokens = [] j = i + 1 while j < len (tokens) and b != 0: if tokens[j].type == TokenType.opening_bracket: b += 1 if tokens[j].type == TokenType.closing_bracket: b -= 1 if b != 0: subtree_tokens.append (tokens[j]) j += 1 subtree_rootnode = cls.build_tree (subtree_tokens) subtree_rootnode.concept.subroot = True if node != None: node.children.append (subtree_rootnode) else: return None i = j - 1 elif tokens[i].type == TokenType.closing_bracket: level_inside_brackets -= 1 common_parent = cls.__pop_common_parent () elif tokens[i].type == TokenType.comma: if level_inside_brackets > 0: node = common_parent elif tokens[i].type == TokenType.equal_sign: pass else: parent_node = node node = PropositionTreeNode () node.parent = parent_node node.text = tokens[i].text if tokens[i].type == TokenType.concept: node.type = PropositionTreeNodeType.concept node.side = PropositionTreeNodeSide.right node.concept = TreeNodeConcept () node.concept.id = tokens[i].concept.id node.concept.name = tokens[i].concept.name node.concept.type = tokens[i].concept.type elif tokens[i].type == TokenType.linkage: node.type = PropositionTreeNodeType.linkage node.side = PropositionTreeNodeSide.right node.linkage = TreeNodeLinkage () node.linkage.id = tokens[i].linkage.id node.linkage.name = tokens[i].linkage.name elif tokens[i].type == TokenType.underscore: node.type = PropositionTreeNodeType.underscore elif tokens[i].type == TokenType.number: node.type = PropositionTreeNodeType.number elif tokens[i].type == TokenType.string: node.type = PropositionTreeNodeType.string elif tokens[i].type == TokenType.code_object: node.type = PropositionTreeNodeType.code_object #print node.text parent_node.children.append (node) i += 1 return root_node
def build_tree(cls, tokens): # Поиск главного понятия действия idx = 0 node = None root_node = None for token in tokens: if token.type == TokenType.concept: if token.concept.type == TokenConceptType.action: node = PropositionTreeNode() node.text = token.text node.type = PropositionTreeNodeType.concept node.side = PropositionTreeNodeSide.center node.concept = TreeNodeConcept() node.concept.id = token.concept.id node.concept.name = token.concept.name node.concept.type = token.concept.type root_node = node break idx += 1 if node == None: cls.__error_text = ErrorHelper.get_text(101) return None # Обработка левой ветки суждения i = idx - 1 while i >= 0: if tokens[i].type == TokenType.equal_sign: if tokens[i + 1].type == TokenType.concept: node.concept.sublink = True else: parent_node = node node = PropositionTreeNode() node.parent = parent_node node.text = tokens[i].text if tokens[i].type == TokenType.concept: node.type = PropositionTreeNodeType.concept node.side = PropositionTreeNodeSide.left node.concept = TreeNodeConcept() node.concept.id = tokens[i].concept.id node.concept.name = tokens[i].concept.name node.concept.type = tokens[i].concept.type elif tokens[i].type == TokenType.linkage: node.type = PropositionTreeNodeType.linkage node.side = PropositionTreeNodeSide.left node.linkage = TreeNodeLinkage() node.linkage.id = tokens[i].linkage.id node.linkage.name = tokens[i].linkage.name elif tokens[i].type == TokenType.underscore: node.type = PropositionTreeNodeType.underscore elif tokens[i].type == TokenType.number: node.type = PropositionTreeNodeType.number elif tokens[i].type == TokenType.string: node.type = PropositionTreeNodeType.string #print node.text parent_node.children.append(node) i -= 1 # Обработка правой ветки суждения i = idx + 1 node = root_node level_inside_brackets = 0 common_parent = None while i < len(tokens): if tokens[i].type == TokenType.point: pass elif tokens[i].type == TokenType.question_mark: pass elif tokens[i].type == TokenType.opening_bracket: level_inside_brackets += 1 if node.type == PropositionTreeNodeType.concept: if level_inside_brackets > 1: cls.__push_common_parent(common_parent) common_parent = node elif node.type == PropositionTreeNodeType.linkage: b = 1 subtree_tokens = [] j = i + 1 while j < len(tokens) and b != 0: if tokens[j].type == TokenType.opening_bracket: b += 1 if tokens[j].type == TokenType.closing_bracket: b -= 1 if b != 0: subtree_tokens.append(tokens[j]) j += 1 subtree_rootnode = cls.build_tree(subtree_tokens) subtree_rootnode.concept.subroot = True if node != None: node.children.append(subtree_rootnode) else: return None i = j - 1 elif tokens[i].type == TokenType.closing_bracket: level_inside_brackets -= 1 common_parent = cls.__pop_common_parent() elif tokens[i].type == TokenType.comma: if level_inside_brackets > 0: node = common_parent elif tokens[i].type == TokenType.equal_sign: pass else: parent_node = node node = PropositionTreeNode() node.parent = parent_node node.text = tokens[i].text if tokens[i].type == TokenType.concept: node.type = PropositionTreeNodeType.concept node.side = PropositionTreeNodeSide.right node.concept = TreeNodeConcept() node.concept.id = tokens[i].concept.id node.concept.name = tokens[i].concept.name node.concept.type = tokens[i].concept.type elif tokens[i].type == TokenType.linkage: node.type = PropositionTreeNodeType.linkage node.side = PropositionTreeNodeSide.right node.linkage = TreeNodeLinkage() node.linkage.id = tokens[i].linkage.id node.linkage.name = tokens[i].linkage.name elif tokens[i].type == TokenType.underscore: node.type = PropositionTreeNodeType.underscore elif tokens[i].type == TokenType.number: node.type = PropositionTreeNodeType.number elif tokens[i].type == TokenType.string: node.type = PropositionTreeNodeType.string elif tokens[i].type == TokenType.code_object: node.type = PropositionTreeNodeType.code_object #print node.text parent_node.children.append(node) i += 1 return root_node