code: function integrateAttr(aNode, name, value, options) {
      var prefixIndex = name.indexOf('-');
      var realName;
      var prefix;
  
      if (prefixIndex > 0) {
          prefix = name.slice(0, prefixIndex);
          realName = name.slice(prefixIndex + 1);
      }
  
      switch (prefix) {
          case 'on':
              var event = {
                  name: realName,
                  modifier: {}
              };
              aNode.events.push(event);
  
              var colonIndex;
              while ((colonIndex = value.indexOf(':')) > 0) {
                  var modifier = value.slice(0, colonIndex);
  
                  // eventHandler("dd:aa") 这种情况不能算modifier，需要辨识
                  if (!/^[a-z]+$/i.test(modifier)) {
                      break;
                  }
  
                  event.modifier[modifier] = true;
                  value = value.slice(colonIndex + 1);
              }
  
              event.expr = parseCall(value, [
                  createAccessor([
                      {type: ExprType.STRING, value: '$event'}
                  ])
              ]);
              break;
  
          case 'san':
          case 's':
              parseDirective(aNode, realName, value, options);
              break;
  
          case 'prop':
              integrateProp(aNode, realName, value, options);
              break;
  
          case 'var':
              if (!aNode.vars) {
                  aNode.vars = [];
              }
  
              realName = kebab2camel(realName);
              aNode.vars.push({
                  name: realName,
                  expr: parseExpr(value.replace(/(^\{\{|\}\}$)/g, ''))
              });
              break;
  
          default:
              integrateProp(aNode, name, value, options);
      }
  }
docs: 解析抽象节点属性
  
  @param {ANode} aNode 抽象节点
  @param {string} name 属性名称
  @param {string} value 属性值
  @param {Object} options 解析参数
  @param {Array?} options.delimiters 插值分隔符列表