示例#1
0
    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
示例#2
0
    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