code: function collectOpt(char) {
      if (char === '\r') {
        return;
      }
  
      char = char === '\n' ? ' ' : char;
      // merge the same operator
      if (last && last.unit === char && !scopeOpt.includes(char)) {
        last.expr += char;
      } else {
        const optEl = {
          expr: char,
          unit: char,
          type: 'opt',
        };
  
        // mark def type, like 'key' in '{ key: value }',
        // which is no need to prepend '_$o'
        let isDef = char === ':' && lastOpt && (lastOpt.expr === '{' || lastOpt.expr === ',');
        isDef = isDef && lastEl && lastEl.type === 'prop';
        if (isDef) {
          lastEl.type = 'def';
        }
  
        if (char !== ' ') {
          lastOpt = optEl;
        }
  
        fragments.push(last = optEl);
      }
    }
docs: collect operator