static parse(sequenceString, options = {}) {
    const trimmedSequenceString = stripSuperfluousWhitespace(sequenceString);

    const keyCombinationsArray = trimmedSequenceString.split(' ');

    try {
      const nonTerminalCombinations = keyCombinationsArray.slice(0, keyCombinationsArray.length-1);
      const terminalCombination = keyCombinationsArray[keyCombinationsArray.length-1];

      const prefix = nonTerminalCombinations.map((keyCombination) => {
        const keysInComboDict = parseCombination(keyCombination, options);

        return normalizedCombinationId(keysInComboDict);
      }).join(' ');

      const keysInComboDict = parseCombination(terminalCombination, options);

      const normalizedComboString = normalizedCombinationId(keysInComboDict);

      const combination = {
        id: normalizedComboString,
        keyDictionary: keysInComboDict,
        keyEventType: options.keyEventType,
        size: Object.keys(keysInComboDict).length
      };

      return { sequence: { prefix, size: nonTerminalCombinations.length + 1 }, combination };
    } catch (InvalidKeyNameError) {
      return { sequence: null, combination: null }
    }
  }
Parses a KeySequenceString and returns a KeySequenceOptions object containing
information about the sequence in a format that is easier to query
@param {KeySequenceString} sequenceString String describing a key sequence to
       parse
@param {Object} options Configuration object describing how the KeySequenceString
       should be parsed.
@param {KeyEventType} options.keyEventType Event record index indicating
       what key event the sequence should match
@param {boolean} options.ensureValidKeys Whether to throw an exception if an invalid
       key name is found in the key combination string.
@returns {KeySequenceOptions} Object containing information about the key
       sequence described by the KeySequenceString