code: function left2text(code, parentNode) {
      if (!parentNode || !parentNode.nodes) {
        return;
      }
      for (var i = parentNode.nodes.length - 1; i >= 0; i--) {
        var node = parentNode.nodes[i];
        left2text(code, node);
        if (node.type === 'left') {
          node.type = 'text';
          var firstChild = node.nodes[0];
          if (firstChild) {
            var lastChild = node.nodes[node.nodes.length - 1];
            node.endpos = firstChild.pos;
            node.value = code.slice(node.pos, node.endpos);
            var params = [i + 1, 0];
            [].push.apply(params, node.nodes);
            [].splice.apply(parentNode.nodes, params);
            if (parentNode.type !== 'cbml') {
              parentNode.endpos = lastChild.endpos;
              parentNode.value = code.slice(parentNode.pos, parentNode.endpos);
            }
          }
          delete node.nodes; // 移除子节点
          delete node.tag;
          delete node.attrs;
          delete node.language;
        }
  
        var nextNode = parentNode.nodes[i + 1];
        if (nextNode && node.type === 'text' && nextNode.type === 'text') { // 合并文本
          nextNode.pos = node.pos;
          nextNode.line = node.line;
          nextNode.col = node.col;
          nextNode.value = code.slice(nextNode.pos, nextNode.endpos);
          parentNode.nodes.splice(i, 1);
        }
      }
    }
docs: 将没有闭合的左侧标签转换成文本节点，并合并相邻的文本节点
  
  @param {string} code 当前代码
  @param {Object} parentNode 父节点