@Override
    public VersionAlgorithm createAlgorithme(final String line) {
        if (isEmpty(line.trim())) {
            return new IdentityAlgo();
        }
        final StringTokenizer tokenizer = new StringTokenizer(explodeLine(line), BLANK_SPACE);
        final List<AlgoNode> nodes = new ArrayList<AlgoNode>();
        AlgoNode currentNode = new AlgoNode(new AndAlgo());
        nodes.add(currentNode);
        String token;
        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken().trim();
            if (isEmpty(token)) {
                continue;
            }
            if ("(".equals(token)) {
                final AlgoNode childNode = new AlgoNode(new AndAlgo());
                currentNode.addChild(childNode);
                currentNode = childNode;
                nodes.add(currentNode);
            } else if (")".equals(token)) {
                nodes.remove(currentNode);
                currentNode = nodes.get(nodes.size() - 1);
            } else if ("&".equals(token) || "&&".equals(token)) {
                currentNode.setType(LogicalType.AND);
            } else if ("||".equals(token)) {
                currentNode.setType(LogicalType.OR);
            } else if (dicoAlgorithms.containsKey(token)) {
                currentNode.addChild(new AlgoNode(dicoAlgorithms.get(token)));
            } else {
                throw new IllegalArgumentException("Pas d'algorithme correspondant au label : " + token);
            }
        }
        return nodes.get(0).computeAlgorithm();
    }